我试着写一个简单的设置来调用父类@classmethod但是得到错误...请告诉我这里的问题是什么?
class Parent(object):
def __init__(self):
print "Parent initialized"
@classmethod
def resource_setup(cls):
print "parent method"
class Child(Parent):
def __init__(self):
print "Child initialized"
@classmethod
def childmethod(cls):
super(Parent, cls).resource_setup()
print "child method"
c = Child()
Child().childmethod()
输出:
Child initialized
Child initialized
Traceback (most recent call last):
File "C:\Users\ANAND\workspace\Scratch\Scratch\Parent.py", line 30, in <module>
Child().childmethod()
File "C:\Users\ANAND\workspace\Scratch\Scratch\Parent.py", line 25, in childmethod
super(Parent, cls).resource_setup()
AttributeError: 'super' object has no attribute 'resource_setup'
问题:
1. When I create a child object c = Child(), I don't see the display of "parent initialized"..I expect the Parent class to be initialized.
2.How can I call the parent method @classmethod from the child @classmethod?
答案 0 :(得分:0)
您需要致电super(Child, cls)
。 super
的第一个参数应该是要调用方法的超类,而不是超类本身。
你的问题1是无关的。如果您希望孩子__init__
致电家长__init__
,则需要使用super
明确表达,就像使用parentmethod
和childmethod
一样。 (也就是说,从孩子super(Child, self).__init__()
内做__init__
。
答案 1 :(得分:0)
当我创建一个子对象c = Child()时,我没有看到“parent initialized”的显示。我希望初始化Parent类。
答:在python中,派生类__init__
不会隐式调用基类的__init__
,需要显式调用它。不像c ++中的构造函数那样,如果你是c ++程序员,这可能会引起一些混淆。
如何从孩子@classmethod调用父方法@classmethod?
答:使用super(Child, cls)
而不是super(Parent, cls)
。