Python 类继承问题

16 投票
5 回答
24146 浏览
提问于 2025-04-15 11:55

我在玩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()

5 个回答

5

员工必须明确调用父类的 __init__(注意是双下划线init,不是单下划线init):

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

你应该明确地调用父类的初始化函数:

class Employee(Person):
    def __init__(self):
        Person.__init__(self)
        self.empnum = "abc123"
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)。这样,如果你以后改变了类的继承关系,比如提取出一个基类并改变继承方式,你就不需要担心你的类会调用错误的父类构造函数。此外,在多重继承的情况下,你只需要一个super调用就能正确调用所有基类的构造函数。

撰写回答