Python héritage et en appelant le constructeur de la classe parent
C'est ce que j'essaie de faire en Python:
class BaseClass:
def __init__(self):
print 'The base class constructor ran!'
self.__test = 42
class ChildClass(BaseClass):
def __init__(self):
print 'The child class constructor ran!'
BaseClass.__init__(self)
def doSomething(self):
print 'Test is: ', self.__test
test = ChildClass()
test.doSomething()
Qui se traduit par:
AttributeError: ChildClass instance has no attribute '_ChildClass__test'
Ce qui donne? Pourquoi n'est-ce pas le travail que j'attends?
appel baseclass.--init-- avant de faire quoi que ce soit d'autre pour référence future,
OriginalL'auteur Keith Palmer Jr. | 2009-07-16
Vous devez vous connecter pour publier un commentaire.
De la documentation python:
Si l'attribut n'est pas nommé __test mais _BaseClass__test.
Cependant, vous ne devriez pas compter sur cela, utilisez auto._test à la place, et la plupart des développeurs python savez que l'attribut est une partie interne de la classe, et non l'interface publique.
C'est un plus OOP question que python question. En accédant à un membre privé d'une super-classe, vous êtes briser l'encapsulation et la création d'une très forte dépendance entre les classes. Super-classe n'est plus autorisé à modifier son fonctionnement interne, même si le public interface reste la même. En bref: ne pas le faire 🙂
Malheureusement, cela signifie que je soit à ré-écrire le python smtpd bibliothèque, ou copier/coller l'intégralité du smtpd de la bibliothèque dans un nouveau fichier. Je n'ai pas vraiment envie de faire l'un de ces, mais besoin d'un accès à la smtpd bibliothèques variables privées...
Vous pouvez utiliser l'obj._BaseClass__attr... il n'est pas interdit ou quoi que ce soit, nous sommes tous des adultes ici, etc. Mais il est bon de knowe les conséquences de le faire et d'essayer de limiter au minimum.
OriginalL'auteur Wojciech Bederski
Vous pouvez utiliser Python introspection installations pour vous obtenir l'information que vous recherchez.
Un simple dir(test) vous donnera
Notez que le '_BaseClass__test". C'est ce que vous cherchez.
Vérifier cette pour plus d'informations.
OriginalL'auteur partoa
Double souligné variables peut être considéré comme "privé". Ils sont déformés avec le nom de la classe, entre autres, de protéger plusieurs baseclasses de remplacer eachothers membres.
Utiliser un seul trait de soulignement si vous voulez que votre attribut être considéré comme privé par d'autres développeurs.
OriginalL'auteur truppo