Python类继承问题

标签 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()

最佳答案

三件事:

  1. 您需要显式调用构造函数。它不会像在 C++ 中那样自动为您调用
  2. 使用继承自对象的新型类
  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 方面,您只需要一次 super 调用即可正确调用所有基类构造函数。

关于Python类继承问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/927985/

相关文章:

javascript - jQuery 在第二次单击时删除类并在第二次单击时禁用悬停

python - 使用 urllib2 从受基本身份验证保护的 Jenkins 服务器获取 URL

python - 使用python的调度程序

java - 创建抛硬币的类和方法

c# - 如何在 C# 中创建类列表以在循环中迭代

c++ - 继承,调用基类构造器

c# - 在 C# 中使用继承而不是名称别名是否正确?

Python文件i/o循环,为什么字典没有更新?

python - 使用 python defaultdict 对列表中的项目进行分组

c++ - 使用 C 从 C++ 访问公共(public)类内存