使用';超级';在Python2.7中

使用';超级';在Python2.7中,python,inheritance,super,Python,Inheritance,Super,我试图在python中使用super扩展我的类初始化。在下面的示例中,我希望类A初始化一个乘以4的参数,并且我希望该参数通过继承在类B中可用。然后我希望B中的另一个初始化采用相同的参数,并将其乘以8。第二次初始化不必在中可用 class A(): def __init__(self,parameter): self.initialize_parameter=4*parameter class B(A): def __init__(self,parameter):

我试图在python中使用super扩展我的类初始化。在下面的示例中,我希望
类A
初始化一个乘以4的参数,并且我希望该参数通过继承在类B中可用。然后我希望B中的另一个初始化采用相同的参数,并将其乘以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:必须是type,而不是classobj


这是我第一次使用继承,有人能指出我做错了什么吗

正确的语法应该是
class A(object)
,而不是
class A()

请注意,我将关键字
class
(这让我相信这里的代码不是复制粘贴的-就您没有尝试运行的代码寻求帮助是一个坏主意!),并且在paren中添加了单词
object
,以将其标记为一个新型Python类。后者是惯用的,如果不是严格必要的话


当我试图完全按照您编写的代码运行代码时,我得到了
SyntaxError:invalid syntax
。当我将单词
class
小写时,在Python2.7上没有任何错误。

正确的语法应该是
class A(object)
,而不是
class A()

请注意,我将关键字
class
(这让我相信这里的代码不是复制粘贴的-就您没有尝试运行的代码寻求帮助是一个坏主意!),并且在paren中添加了单词
object
,以将其标记为一个新型Python类。后者是惯用的,如果不是严格必要的话


当我试图完全按照您编写的代码运行代码时,我得到了
SyntaxError:invalid syntax
。当我将单词
小写时,我在Python 2.7上一点错误都没有。

值得一提的是,
super
不受旧式类的支持,即那些最终不从
对象
继承的类。这就是
TypeError
异常的原因。是的,你是对的。我试图在没有实际测试代码的情况下抽象我的情况,显然犯了错误-这是个坏主意,重点是你的意思是在我的示例中,我必须在类定义中添加参数,即第一行是
class a(parameter)
?@user3059024:你确实需要
class a(object):
作为
A
定义的第一行。@user3059024:没问题。但是
object
并不完全是一个关键字:它是其他(新样式)类继承的基类对象。从
对象
类派生出的一个重要功能是能够使用
super()
值得一提的是,
super
不受旧式类的支持,即那些最终不从
对象
继承的类。这就是
TypeError
异常的原因。是的,你是对的。我试图在没有实际测试代码的情况下抽象我的情况,显然犯了错误-这是个坏主意,重点是你的意思是在我的示例中,我必须在类定义中添加参数,即第一行是
class a(parameter)
?@user3059024:你确实需要
class a(object):
作为
A
定义的第一行。@user3059024:没问题。但是
object
并不完全是一个关键字:它是其他(新样式)类继承的基类对象。从
对象
类派生给类的一个重要功能是能够使用
super()
FWIW,更常见的做法是将super
\uuuuu init\uuuuu
作为子
\uuuu init\uuuuu
中的第一个命令调用(如果需要调用的话),而不是在最后执行。这样子初始值设定项就更容易覆盖或扩充超级初始值设定项完成的内容。FWIW,更常见的做法是将超级
\uuuuuu init\uuuuu
(如果您需要调用它)作为子
\uuuuu init\uuuu
中的第一个命令,而不是在最后执行。这样子初始值设定项就更容易覆盖或扩充超级初始值设定项完成的内容。