Python 类继承问题

问题描述 投票:0回答:5

我正在使用 Python 类继承,遇到了一个问题,如果从子类(下面的代码)调用继承的

__init__
则不会被执行,我从 Active Python 得到的结果是:


>>> start
Tom Sneed
Sue Ann
Traceback (most recent call last):
  File "C:\Python26\Lib\site-packages\pythonwin\pywin\framework\scriptutils.py", line 312, <br>in RunScript
    exec codeObject in __main__.__dict__
  File "C:\temp\classtest.py", line 22, in <module>
    print y.get_emp()
  File "C:\temp\classtest.py", line 16, in get_emp
    return self.FirstName + ' ' + 'abc'
AttributeError: Employee instance has no attribute 'FirstName'

这是代码

class Person():
    AnotherName = 'Sue Ann'
    def __init__(self):
        self.FirstName = 'Tom'
        self.LastName = 'Sneed'

    def get_name(self):
        return self.FirstName + ' ' + self.LastName

class Employee(Person):
    def __init__(self):
        self.empnum = 'abc123'

    def get_emp(self):
        print self.AnotherName
        return self.FirstName + ' ' + 'abc'

x = Person()
y = Employee()
print 'start'
print x.get_name()
print y.get_emp()
python class inheritance
5个回答
25
投票

三件事:

  1. 您需要显式调用构造函数。它不会像 C++ 那样自动为您调用
  2. 使用继承自object的新式类
  3. 对于新式类,使用可用的 super() 方法

这看起来像:

class Person(object):
    AnotherName = 'Sue Ann'
    def __init__(self):
        super(Person, self).__init__()
        self.FirstName = 'Tom'
        self.LastName = 'Sneed'

    def get_name(self):
        return self.FirstName + ' ' + self.LastName

class Employee(Person):
    def __init__(self):
        super(Employee, self).__init__()
        self.empnum = 'abc123'

    def get_emp(self):
        print self.AnotherName
        return self.FirstName + ' ' + 'abc'

建议使用 super,因为它也可以正确处理在多重继承情况下仅调用一次构造函数(只要继承图中的每个类也使用 super)。如果/当您更改类的继承来源时(例如,您分解出基类并更改派生,并且不需要担心您的类调用错误的父类),这也是您需要更改代码的地方构造函数)。同样在 MI 方面,您只需要一次超级调用即可正确调用所有基类构造函数。


9
投票

您应该显式调用超类的 init 函数:

class Employee(Person):
    def __init__(self):
        Person.__init__(self)
        self.empnum = "abc123"

5
投票

员工必须显式调用父级的 __init__ (而不是 init):

 class Employee(Person):  
    def __init__(self):  
         Person.__init__(self)  
         self.empnum = 'abc123'  

2
投票

而不是

super(class, instance)
模式为什么不直接使用
super(instance)
因为类总是
instance.__class__

有没有具体情况不会

instance.__class__


0
投票

在子类的__init__方法中使用super().

init
()调用父类的构造函数,确保继承属性的正确初始化并避免代码冗余。

class Employee(Person):
    def __init__(self):
        self.empnum = 'abc123'
        super().__init__()
© www.soinside.com 2019 - 2024. All rights reserved.