我想构建一个继承自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
或Second
的方法之间切换。
如果action
是Third
的方法,则应在first_action
或second_action
之间切换。
任何建议都表示赞赏!
答案 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)
您还需要一些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
命名,这是该类型的名称。
答案 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_action
或second_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
您可以通过这种方式获得预期的输出。