我想构建一个继承自 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,那是类型的名称。
