2017-05-11 14 views
1

Python - 属性が継承されないのはなぜですか?以下のコードで

>>> 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} 
>>> 

質問:Employee

なぜDeveloper.__dict__示していないメンバー?構文class Developer(Employee)で正確に何をしていますか?

+2

親クラスのdictからすべてを子にコピーすることで、属性の継承が機能しません。 – user2357112

+0

クラスがインスタンス化されると、インスタンス辞書は同じです。 – JacobIRR

答えて

3

__dict__は、サブクラスで定義されている属性であり、その親ではありません。属性がサブクラスで検索されて見つからない場合、属性がの場合は、に目的の属性があるまで、MRO(メソッド解決順序、親クラスのセット)をスキャンします。親から子へのすべてのコピー__dict__は、メモリ上で無駄になり、リスク値が同期しなくなります(子が定義された後に親が猿のパッチが適用され、子がすでに親のコピー__dict__をキャッシュしている場合、すべてが壊れるだろう)。

1

クラスオブジェクトのうち__dict__が見つかりました。インスタンスではありません。 Developerインスタンスの__dict__を見ると、継承された属性が表示されます。メソッド(およびクラス属性)は、mroを使用して解決されます(Method Resolution Order (MRO) in new style Python classesで説明)。

関連する問題