2016-04-07 8 views

Antwort

4

Sie benannte Ihre Methode __init_var mit zwei anfänglichen Unterstrichen, es ist eine Klasse private Methode machen. Der Name wird verfälscht, um sicherzustellen, dass Unterklassen nicht damit kollidieren. Von den Reserved classes of identifiers section:

__*
Class-privaten Namen. Namen in dieser Kategorie werden, wenn sie im Kontext einer Klassendefinition verwendet werden, so umgeschrieben, dass sie ein beschädigtes Formular verwenden, um Namenskonflikte zwischen "privaten" Attributen von Basis- und abgeleiteten Klassen zu vermeiden.

und im Identifiers (Names) section:

Privat Namen Mangeln: Wenn eine Kennung, die in einer Klassendefinition textuell tritt mit zwei oder mehr beginnt Unterstrichen und in zwei oder mehr Unterstreichungen nicht, beenden Es wird als privater Name dieser Klasse betrachtet. Private Namen werden in eine längere Form umgewandelt, bevor für sie Code generiert wird. Die Umwandlung fügt den Klassennamen ein, wobei führende Unterstriche entfernt und ein einzelner Unterstrich vor dem Namen eingefügt wird. Zum Beispiel wird der Bezeichner __spam, der in einer Klasse mit dem Namen Ham auftritt, in _Ham__spam umgewandelt.

So wird A.__init_var zu A._A__init_var umbenannt und A.__init__() verändert A._A__init_var() zu nennen. Die umbenannte B._B__init_var() Methode wird aufgerufen, nie, weil sie einen anderen Namen hat:

>>> dir(A) 
['_A__init_var', '__doc__', '__init__', '__module__'] 
>>> import dis 
>>> dis.dis(A.__init__) # disassemble the bytecode for A.__init__ 
    3   0 LOAD_FAST    0 (self) 
       3 LOAD_ATTR    0 (_A__init_var) 
       6 CALL_FUNCTION   0 
       9 POP_TOP 
      10 LOAD_CONST    0 (None) 
      13 RETURN_VALUE 
>>> dir(B) 
['_A__init_var', '_B__init_var', '__doc__', '__init__', '__module__'] 

ein jene anfänglichen Unterstrichen entfernen, so nennt es _init_var:

class A: 
    def __init__(self): 
     self._init_var() 

    def _init_var(self): 
     self.var = 11 

class B(A): 
    def __init__(self): 
     A.__init__(self) 

    def _init_var(self): 
     self.var = 10 
Verwandte Themen