在下面的代码中
>>> 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__
不显示{class Developer(Employee)
做什么?
您看到的是类对象的
__dict__
,而不是实例。如果您查看Developer
实例的__dict__
,您将看到继承的属性。方法(和类属性)使用mro
解析,如Method Resolution Order (MRO) in new style Python classes所述。在__dict__
是在子类上特别定义的属性,而不是它的父类。当在子类上查找某个属性而没有找到时,它将扫描MRO(方法解析顺序,父类集合),直到找到一个具有所需属性的。将所有内容从父对象复制到子对象__dict__
将浪费内存,并且有使值不同步的风险(如果父对象在定义子对象之后被猴子修补,并且子对象已经在其自身内缓存了父对象的__dict__
的副本,则所有内容都将中断)。在相关问题 更多 >
编程相关推荐