Python为什么属性不被继承?

2024-06-25 23:40:04 发布

您现在位置: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}
>>> 

问题:

为什么Developer.__dict__不显示{}的成员?我们到底在用语法class Developer(Employee)做什么?


Tags: selfdeveloperreturninitdefemployeefirstnamepay
2条回答

您看到的是类对象的__dict__,而不是实例。如果您查看Developer实例的__dict__,您将看到继承的属性。方法(和类属性)使用mro解析,如Method Resolution Order (MRO) in new style Python classes所述。在

__dict__是在子类上特别定义的属性,而不是它的父类。当在子类上查找某个属性而没有找到时,它将扫描MRO(方法解析顺序,父类集合),直到找到一个具有所需属性的。将所有内容从父对象复制到子对象__dict__将浪费内存,并且有使值不同步的风险(如果父对象在定义子对象之后被猴子修补,并且子对象已经在其自身内缓存了父对象的__dict__的副本,则所有内容都将中断)。在

相关问题 更多 >