54 Stimmen

Python "geschützte" Attribute

Wie kann ich von einer Unterklasse aus auf ein privates Attribut einer übergeordneten Klasse zugreifen (ohne es öffentlich zu machen)?

2voto

Jeff Silverman Punkte 644

Ich denke, dieser Code ist etwas klarer als der von Steve. Steves Antwort war sehr hilfreich für das, was ich zu tun versuche, also danke! Ich habe dies mit Python 2.7 und Python 3.6 getestet.

#! /usr/bin/python
#
# From https://stackoverflow.com/questions/797771/python-protected-attributes
from __future__ import print_function
import sys

class Stock(object):

    def __init__(self, stockName):

        # '_' is just a convention and does nothing
        self.__stockName  = stockName   # private now

    @property # when you do Stock.name, it will call this function
    def name(self):
        print("In the getter, __stockName is %s" % self.__stockName, file=sys.stderr)
        return self.__stockName

    @name.setter # when you do Stock.name = x, it will call this function
    def name(self, name):
        print("In the setter, name is %s will become %s" % ( self.__stockName, name), file=sys.stderr)
        self.__stockName = name

if __name__ == "__main__":
    myStock = Stock("stock111")

    try:
        myStock.__stockName  # It is private. You can't access it.
    except AttributeError as a:
        print("As expect, raised AttributeError", str(a), file=sys.stderr )
    else:
        print("myStock.__stockName did did *not* raise an AttributeError exception")

    #Now you can myStock.name
    myStock.name = "Murphy"
    N = float(input("input to your stock: " + str(myStock.name)+" ? "))
    print("The value of %s is %s" % (myStock.name, N) )

0voto

Machen Sie eine Accessor-Methode, es sei denn, ich übersehe etwas:

def get_private_attrib(self):
  return self.__privateWhatever

0voto

DevBush Punkte 145

Code geändert von geeksforgeeks

# program to illustrate protected
# data members in a class 

# Defining a class
class Geek: 
    # private
    __name = "R2J"
    # protected data members 
    _roll = 1706256
    def __init__(self, value):
        value1 = value
        self.value2 = value
    # public member function 
    def displayNameAndRoll(self): 

        # accessing protected data members 
        print("Name: ", self.__name) 
        print("Roll: ", self._roll) 

# creating objects of the class         
obj = Geek(1)
obj.__name = 'abc'
obj._roll = 12345

# calling public member 
# functions of the class 
obj.displayNameAndRoll() 

Beachten Sie, dass ich ohne Setter das geschützte Attribut ändern kann, aber nicht das private.

Name:  R2J
Roll:  12345

OBS: läuft in Python 3.8

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X