Python类继承问题

时间:2009-05-29 20:28:24

标签: python class inheritance

我正在使用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()

4 个答案:

答案 0 :(得分:25)

三件事:

  1. 您需要显式调用构造函数。它不像C ++中那样自动调用
  2. 使用从object
  3. 继承的新样式类
  4. 使用新式类,使用可用的super()方法
  5. 这看起来像是:

    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前端,您只需要一个超级调用来正确调用所有基类构造函数。

答案 1 :(得分:9)

你应该明确地调用超类'init函数:

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

答案 2 :(得分:5)

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

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

答案 3 :(得分:2)

而不是super(class, instance)模式,为什么不只是使用super(instance)作为类总是instance.__class__

是否存在不属于instance.__class__的特定情况?