Wie kann ich von einer Unterklasse aus auf ein privates Attribut einer übergeordneten Klasse zugreifen (ohne es öffentlich zu machen)?
Antworten
Zu viele Anzeigen?
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) )
Nicht registrierter Benutzer
Punkte
0
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
- See previous answers
- Weitere Antworten anzeigen