如何在Python中从多个类继承的方法之间切换

时间:2015-05-11 06:17:55

标签: python

我想构建一个继承自dict和其他类的类。

根据someDict(初始词典)的键,Third类应继承FirstSecond

这是一个基本的例子:

class First(object):

  def first_action(self):
      print "first_action"


class Second(object):

  def second_action(self):
      print "second_action"


class Third(dict, First, Second):
   """This is not running code
      but, rather, an example of desired functionality.
   """
   if "x" == someDict["some_key"]:
       third_action == First.first_action()
       print third_action
   else:
       third_action == Second.second_action()
       print third_action

所需的输出:

obj = Third()
obj.third_action()
'first_action'  # <- Should print this value if dict["some_key"] = "x"
'second_action' # <- if someDict["some_key"] != "x"

对于更一般的案例Third类,根据someDict键的值,应在属于FirstSecond的方法之间切换。 如果actionThird的方法,则应在first_actionsecond_action之间切换。

任何建议都表示赞赏!

3 个答案:

答案 0 :(得分:3)

一般情况

只要some_key可以更改,继承就不是您想要的。尽管你technically可以制作这种变色龙类,但你应该definitely avoid this

基本上,您应该根据您的条件("x" == someDict["some_key"])明确覆盖所有变色龙方法并在其中调用另一个方法。

您也可以查看decorator pattern。您的对象可以存储action并根据条件应用不同的装饰器。再一次,就我理解的问题而言,条件可能会有所不同,因此必须每次都检查一次(这意味着你应该覆盖所有依赖于这种情况的方法)。

您还可能希望覆盖所有可能更改some_key而非所有变色龙的方法:它允许在"x" == someDict["some_key"]时缓存some_key的结果没有改变。

预定义词典案例

在评论部分,您说您的字典是预定义的。在这种情况下,您应该只定义两个不同的类:

class ThirdA(dict, First)
class ThirbB(dict, Second)

您还需要一些factoryThirdAThirdB选择。

class ThirdFactory(object):
    @classmethod
    def create(cls, dictionary):
        if "x" == dict["some_key"]:
            return ThirdA(dictionary)
        else:
            return ThirdB(dictionary)

Factory method也适用于此,只要您有合适的类来放置它。)

所以现在你可以

my_object = ThirdFactory.create(dict(some_key='x'))

请注意,对象的类永远不会改变。如果您想要更改,请查看我的答案的第一部分。

P上。 S.不要为您的字典dict命名,这是该类型的名称。

答案 1 :(得分:1)

从第一或第二类中分配函数时,您不需要放括号。而且我也不明白你在这行中做了什么

if "x" == dict["some_key"]

dict是一些预定义的字典,那么你不应该使用名称&#34; dict&#34;因为它会覆盖默认的builtin dict关键字。假设它是一个预定义的字典(让我们将其命名为someDict)。这样做。

class Third(dict, First, Second):
   if "x" == someDict["some_key"]:
       third_action = First.first_action
       print action
   else:
       third_action = Second.second_action
       print action

答案 2 :(得分:1)

first_actionsecond_action不是类方法,因此您无法以这种方式调用它们。 你可以像这样写:

class First(object):

  def first_action(self):
      print "first_action"

class Second(object):

  def second_action(self):
      print "second_action"

# you have to change name of that dictionary from dict to my_dict since dict is the name of a built-in class
class Third(my_dict, First, Second):
   """This is not running code
      but, rather, an example of desired functionality.
   """
   # define a function named third_action to achieve this
   def third_action(self):
       if "x" == my_dict["some_key"]:
           # you have to call instance method this way
           third_action == self.first_action()
           print action
       else:
           third_action == self.second_action()
           print action

您可以通过这种方式获得预期的输出。