如何使用父类对象调用子类方法

时间:2018-04-10 04:28:42

标签: python python-2.7

我对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)

这是什么解决方案..?我在哪里做错了??

2 个答案:

答案 0 :(得分:1)

在Python 2中,super接受两个参数,正如错误消息所解释的那样。你这样使用它:

super(Child, self).__init__()

但是,您还必须将所有必需的参数传递给__init__。由于您的Parent需要hostuserpassword,因此您需要这些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()

这就是我在单个类对象的帮助下设法访问所有子类对象的方法。现在,我不必实例化子类,无论它们在哪里被调用,这都是我正在寻找的。请告诉我这是否是一个有效的解决方案(或)我需要做些什么来改进它。感谢