Example using 'super' In Python2.7
我正在尝试在Python中使用super扩展类初始化。在下面的示例中,我希望Class A初始化一个乘以4的参数,并且希望这个参数通过继承在类B中可用。然后我希望B中的另一个初始化采用相同的参数,并将其乘以8。第二次初始化不必在中可用。
1 2 3 4 5 6 7 8
| class A():
def __init__(self,parameter):
self.initialize_parameter=4*parameter
class B(A):
def __init__(self,parameter): #note this parameter is intended to be the same parameter from Class A
self.another_parameter=parameter*8
super(B,self).__init__(parameter) |
我一直在阅读的文档似乎表明上面的语法是正确的(我认为),但是关于这个主题的文档相当混乱。上面的代码返回TypeError: must be type, not classobj。
这是我第一次使用继承,有人能告诉我做错了什么吗?
- fwiw,把超级EDOCX1(如果你需要调用它的话)称为子__init__中的第一个命令,而不是在最后这样做,这是更常见的做法。这样子初始值设定项更容易重写或扩充由超级初始值设定项完成的内容。
正确的语法应该是class A(object),而不是Class A()。
注意,我都把关键字class放在了较低的大小写中(这让我相信您这里的代码不是复制粘贴的——在您没有尝试运行的代码上请求帮助是一个坏主意!)并在parens中添加了单词object,以将其标记为新类型的python类。后者是惯用的,如果不是严格必要的话。
当我试图按照您编写的代码运行代码时,我得到了SyntaxError: invalid syntax。当我将单词class小写时,在python 2.7上完全没有错误。
- 值得一提的是,super不受旧样式类的支持,即那些最终不从object继承的类。这就是TypeError例外的原因。
- 是的,你是对的。我试图在没有实际测试代码的情况下抽象我的情况,显然犯了错误——这是个坏主意
- 您的意思是在我的示例中,我必须向类定义添加参数,即第一行是class A(parameter)?
- @用户3059024:您实际上需要class A(object):作为A定义的第一行。
- 啊,好吧,object是一个关键字。我现在明白了,谢谢
- @用户3059024:没问题。但object并不是一个关键字:它是其他(新样式)类继承的基类对象。从object类衍生出的一个重要能力是使用super()的能力。