Skip to main content
 首页 » 编程设计

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

2025年05月04日52fff_TT

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

基于 someDict(初始字典)的键,Third 类应该继承自 First 或 Second.

这是一个基本的例子:

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 的键值,应该在属于 First 或 第二个。 如果action 是Third 的方法,它应该在first_action 或second_action 之间切换。

欢迎任何建议!

请您参考如下方法:

一般情况

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

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

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

您可能还想覆盖所有可以更改 some_key 的方法,而不是所有 chameleon 方法:它允许缓存 "x"== 的结果someDict["some_key"] 而 some_key 没有改变。

预定义字典大小写

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

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

您还需要一些 factory为您选择 ThirdA 和 ThirdB。

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,那是类型的名称。