Python继承简单问题

时间:2014-10-20 20:39:54

标签: python inheritance

我是python的新手。这是一个演示继承的简单程序。我不能  判断错误是什么。需要帮助。

class games():
    def __init__(self):
        self.someattri = 100

class soccer(games):
    def __init__(self):
        super(soccer).__init__()

s = soccer()
print s.someattri

错误:

Traceback (most recent call last):
  File "/Users/sam/Desktop/Desktop/python/files.py", line 9, in <module>
    s = soccer()
  File "/Users/sam/Desktop/Desktop/python/files.py", line 7, in __init__
    super(soccer).__init__()
TypeError: must be type, not classobj

1 个答案:

答案 0 :(得分:1)

问题在于,通过编写class games(),您明确要求Python创建旧式类,而不是新式类。并且您不能将super用于旧式类。

解决方案就是不这样做。写class games(object)来创建一个新式的类。

这会让你超越第一个错误,但是第二个错误:super有两个参数,类型和self实例。所以,您需要super(soccer, self).__init__()


错误信息有点神秘 - 您必须知道classobj是任何旧式类的类型,而type是任何新式类的类型(没有自定义的元类)来理解它,任何理解它的人都不会有这个问题......但事实证明这是一个很难在错误中解释的事情没有让人们学习东西的消息,他们最好不要学习。因此,最终,Python通过完全摆脱旧式类来解决问题。如果你使用的是Python 3.0或更新版本,那么第一个问题就不存在了(第二个问题就是你可以编写更简单的super().__init__())。


如果您想了解有关旧式和新式课程的更多信息,2.2文档中的Unifying types and classes仍然是最详细的解释,来自Guido博客的The Inside Story on New-Style Classes给出了大多数背景。

但实际上,你不需要知道任何这些东西;所有你需要知道的是,旧式课程是出于历史原因,你不想处理它们,所以你应该做以下其中一项:

  • 升级到3.0或更高版本。
  • 始终代替class Foo(object):class Foo: