我对Python继承有点新意。我有一个像这样的代码
/:(?!:)\S+:/gim
以下是儿童班。父类和子类都在同一个文件中
class Parent(object):
'''
Class for Parent
'''
def __init__(self, host, user, password):
self.host = host
self.user = user
self.password = password
self.child = Child()
def method1(self,param1, param2, param3):
self.child.method1(param1, param2, param3)
现在,我有另一个python脚本,我将初始化父对象并调用method1
class Child(Parent):
'''
Class for Child
'''
def __init__(self):
super(Child).__init__()
def method1(self, param1, param2, param3):
// My actual code will be here
通过上述方法,我期待Child的method1将被执行。但事实并非如此。我收到以下错误
client = Parent(host, user, password)
client.method1(param1, param2, param3)
这是什么解决方案..?我在哪里做错了??
答案 0 :(得分:1)
在Python 2中,super
接受两个参数,正如错误消息所解释的那样。你这样使用它:
super(Child, self).__init__()
但是,您还必须将所有必需的参数传递给__init__
。由于您的Parent
需要host
,user
和password
,因此您需要这些super
初始值设定项。所以你可能想在Child
中找到类似的东西:
def __init__(self, host, user, password):
super(Child, self).__init__(host, user, password)
虽然Child.__init__
除了尝试super
之外并没有做任何其他事情,但更简单的做法是首先不要覆盖__init__
。
无论如何,一旦你解决super
问题,无论哪种方式,你只会进行无限递归 - Parent
创建一个Child()
,这超级Parent
构造函数因此创建另一个Child()
,依此类推,直到您收到异常。
事实上,你的设计非常奇怪。对象需要保持对其子类之一的实例的引用(更不用说创建)很少见。通常,您只想将继承用作继承。像这样:
class Parent(object):
'''
Class for Parent
'''
def __init__(self, host, user, password):
self.host = host
self.user = user
self.password = password
self.child = Child()
class Child(Parent):
def method1(self, param1, param2, param3):
# actual code here
现在,如果您创建child = Child(host, user, password)
,则可以在其上调用child.method1(arg1, arg2, arg3)
。如果您想在Parent
中提供默认实现,则可以。您甚至可以将Child
和其他任何孩子在自己的代码之前或之后通过super
进行实施前或后实施。这个玩具模型不可能说出你真正想要的那个,但对于真正的课程来说,它通常很明显。
答案 1 :(得分:0)
我在Singleton类的帮助下成功实现了这一目标。这就是我所做的。这是父类。
class Parent(object):
'''
Class for Parent
'''
def __init__(self, host, user, password):
self.host = host
self.user = user
self.password = password
def helper_method1():
// Implementation
然后我创建了一个单例类
class ParentObjMgr(object):
'''
A Singleton that stores the objects of different child classes.
The child class needs to be instantiated here.
This class needs to be instantiated in the caller.
'''
__metaclass__ = Singleton
def __init__(self, host, user, password):
self._host = host
self._user = user
self._password = password
self._child1 = None
self._child2 = None
def get_child1(self):
if not self._child1:
self._child1 = Child1(self._host, self._user, self._password)
return self._child1
def get_child2(self):
if not self._child2:
self._child2 = Child2(self._host, self._user, self._password)
return self._child2
现在我将实现子类
class Child1(Parent):
// Implementation
class Child2(Parent):
// Implementation
self.helper_method1()
现在在来电者中,我会这样做
parent_object_mgr=ParentObjMgr(self.host, self.user, self.password)
child1=parent_object_mgr.get_child1()
child2=parent_object_mgr.get_child2()
这就是我在单个类对象的帮助下设法访问所有子类对象的方法。现在,我不必实例化子类,无论它们在哪里被调用,这都是我正在寻找的。请告诉我这是否是一个有效的解决方案(或)我需要做些什么来改进它。感谢