2016-05-28 14 views
-5

Dies ist von the Python docs. Ich verstehe das nicht, kann jemand ein paar Beispiele geben?So verstehen Sie dieses Dokument

Wenn eine Klasse auch in einer Basisklasse definiert einen Schlitz definiert, die Instanz-Variable durch die Basisklasse Schlitz definiert ist, unzugänglich (außer durch seinen Descriptor Abrufen direkt von der Basisklasse). Dies macht die Bedeutung des Programms undefiniert. In der Zukunft kann eine Überprüfung hinzugefügt werden, um dies zu verhindern.

Ich habe versucht, ein Beispiel dafür zu machen, aber gescheitert. Wenn ich das Programm unten ausführe, druckt es 1, so dass die Variable nicht zugänglich ist. Wann wäre es?

class Base(object): 
    __slots__ = 'a' 

    def __init__(self): 
     self.a = 1 

class Subclass(Base): 
    __slots__ = 'a' 

    def __init__(self): 
     super(Subclass, self).__init__() 
     print self.a 

Subclass() 
+0

Auszug ist ziemlich geradlinig. Welchen Teil davon verstehst du nicht? –

+0

Ich habe versucht, ein Beispiel zu erstellen, um deine Frage zu beantworten, und habe das Gegenteil von dem gefunden, was die Doktoren gesagt haben, also habe ich es in deine Frage bearbeitet und bin jetzt auch interessiert, welche Antworten die Leute haben. –

+0

die durch den Basisklassen-Slot definierte Instanzvariable ist nicht zugänglich, b = Base() print b.a Ich dachte, die b.a ist nicht zugänglich, was ist der unzugängliche? – user2352151

Antwort

2

Wenn ich das Programm laufen darunter 1 druckt, so dass die Variable nicht unzugänglich.

Sie haben tatsächlich zweia Instanzvariablen hier. Der durch Base definierte ist nicht durch Attributzugriff zugänglich; Für ein Objekt vom Typ Subclass gehen alle Zugriffe auf self.a, einschließlich desjenigen innerhalb Base.__init__, auf die Instanzvariable, die durch Subclass definiert ist.

Wenn Sie den Base.a Descriptor manuell abrufen, können Sie den Slot von Base definiert zugreifen:

>>> x = Subclass() 
1 
>>> Base.a.__get__(x) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: a 
>>> Base.a.__set__(x, 2) 
>>> Base.a.__get__(x) 
2 
>>> Subclass.a.__get__(x) 
1 

Wie Sie sehen können, Base.a und Subclass.a unabhängig sind, trotz den gleichen Namen teilen.

+0

Wenn die Unterklasse nicht __slots__ hat, x = Subclass(); Base.a .__ get __ (x) wird funktionieren, der Doc bedeutet das? Ich dachte immer ist b = Base(); dann ist b.a nicht erreichbar !! – user2352151

Verwandte Themen