【发布时间】:2021-02-18 13:21:35
【问题描述】:
我正在尝试存储在类中定义的特定 actions。
为了减少代码重复,我想使用一个 mixin 类来存储基于装饰器的所有操作。
这个想法是其他人应该可以直接使用新操作来扩展类。我特别想避免在源代码中明确列出这些操作(这应该由装饰器处理)。
这就是我想出的。不幸的是,在所有.actions 列表中,所有类的所有操作都被列出。
但是,我想要一个只列出特定类的操作的解决方案。
class ActionMixin:
actions = []
@staticmethod
def action(fun):
ActionMixin.actions.append(fun)
return fun
class Human(ActionMixin):
@ActionMixin.action
def talk(self):
pass
class Dog(ActionMixin):
@ActionMixin.action
def wuff(self):
pass
class Cat(ActionMixin):
@ActionMixin.action
def miau(self):
pass
if __name__ == "__main__":
party = [Human(), Dog()]
possible_actions = [action for memer in party for action in member.actions]
# I would like that possible_actions is now only Human.talk() and Dog.wuff()
# instead it is 2 times all actions
print(len(possible_actions)) # == 6
【问题讨论】:
-
必须是mixin吗?
-
不一定,但我认为这是最简单的。如果您有一个更简单的解决方案,那么无需重复代码即可工作,这对我来说很好
-
你能说明你想做什么吗?
Human和Dog均见 完全相同ActionMixin.actions。通过迭代for memer in party,您明确要求将所有内容列出两次。 -
@MisterMiyagi 那是我的问题——我不希望他们使用完全相同的 ActionMixin.actions