2017-05-11 1 views
1

Im folgenden Code,Python - Warum Attribute nicht vererbt werden?

>>> class Employee: 

    numOfEmployees = 0 
    raiseAmount = 1.04 

    def __init__(self, firstName, lastName, pay): 
     self.firstName = firstName 
     self.lastName = lastName 
     self.pay = pay 
     self.email = firstName + '.' + lastName + '@arista.com' 

     Employee.numOfEmployees += 1 

    def fullName(self): 
     return '{} {}'.format(self.firstName, self.lastName) 

    def appyRaise(self): 
     self.pay = int(self.pay * self.raiseAmount) 

     @classmethod 
     def setRaiseAmt(cls, amount): 
      cls.raiseAmount = amount 

     @classmethod 
     def createEmployee(cls, employeeStr): 
      firstName, lastName, pay = employeeStr.split('-') 
      return cls(firstName, lastName, pay) 

     @staticmethod 
     def isWorkDay(day): 
      if day.weekday() == 5 or day.weekday() == 6: 
       return False 
      return True 

>>> class Developer(Employee): 
      pass 


>>> Developer.__dict__ 
{'__module__': '__main__', '__doc__': None} 
>>> Employee.__dict__ 
{'__module__': '__main__', 'createEmployee': <classmethod object at 0x7f2727731398>, 'numOfEmployees': 0, 'setRaiseAmt': <classmethod object at 0x7f27277310f8>, 'isWorkDay': <staticmethod object at 0x7f27277313d0>, 'appyRaise': <function appyRaise at 0x7f2727721f50>, 'fullName': <function fullName at 0x7f2727721ed8>, '__doc__': None, '__init__': <function __init__ at 0x7f2727721e60>, 'raiseAmount': 1.04} 
>>> 

Frage:

Warum Mitglieder Employee zeigen sich Developer.__dict__ nicht? Was genau machen wir mit der Syntax class Developer(Employee)?

+2

Attributvererbung funktioniert nicht, indem alles aus dem Dict der Elternklasse in das Kind kopiert wird. – user2357112

+0

Das Instanzwörterbuch ist nach der Instanziierung der Klassen identisch. – JacobIRR

Antwort

3

__dict__ sind die Attribute, die speziell für die Unterklasse definiert sind, nicht ihre Eltern. Wenn ein Attribut in der Unterklasse nachgeschlagen wird und nicht gefunden wird, durchsucht es die MRO (Reihenfolge der Methodenauflösung, die Menge der übergeordneten Klassen), bis es eins findet, das das gewünschte Attribut hat. Das Kopieren aller Elemente vom übergeordneten Element zum untergeordneten Element __dict__ wäre verschwenderisch im Speicher und die Risikowerte würden nicht mehr synchron sein (wenn das übergeordnete Element nach der Definition des untergeordneten Objekts mit einem Affepatch versehen ist und das untergeordnete Element bereits eine Kopie der __dict__ des übergeordneten Elements im Cache gespeichert hat, alles würde brechen).

1

Sie betrachten die der Klassenobjekte, nicht der Instanzen. Wenn Sie sich die __dict__ einer Developer Instanz ansehen, werden Sie die geerbten Attribute sehen. Methoden (und Klassenattribute) werden unter Verwendung des mro gelöst, wie unter Method Resolution Order (MRO) in new style Python classes diskutiert.

Verwandte Themen