[英]Python - Why attributes are not inherited?
在下面的代碼中,
>>> 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}
>>>
題:
為什么Developer.__dict__
不顯示Employee
成員? 語法class Developer(Employee)
到底在做什么?
__dict__
是在子類上專門定義的屬性,而不是其父類。 當在子類上查找某個屬性但未找到該屬性時,它將掃描MRO(方法解析順序,父類的集合),直到找到確實具有所需屬性的屬性。 將所有內容從父級復制到子級__dict__
會浪費內存,並且風險值不同步(如果在定義了子級之后父級被猴子修補,並且子級已經在其自身中緩存了父級__dict__
的副本,一切都會破裂)。
您正在查看的是類對象而不是實例的__dict__
。 如果查看Developer
實例的__dict__
,您將看到繼承的屬性。 方法(和類屬性)使用mro
進行解析,如新方法Python類中的“方法解析順序”(MRO)所述 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.