簡體   English   中英

Python-為什么不繼承屬性?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM