【发布时间】:2021-09-25 01:27:59
【问题描述】:
我知道this question,但我认为它不包括我的情况。
我有一个带有许多方法的外部 Dummy 类,所有方法都使用实例属性。我希望能够将其作为参数传递,而不是使用此实例属性。我的解决方案是保留一组假人,并在必要时使用具有适当属性的人。
class Dummy:
def __init__(self, prefix="dum"):
self.prefix = prefix
def toto(self):
return f"{self.prefix}_toto"
def titi(self):
return f"{self.prefix}_titi"
def tata(self):
return f"{self.prefix}_tata"
class DynamicDummy:
def __init__(self):
self.dummies = {}
def _get_dummy(self, prefix):
dummy = self.dummies.get(prefix)
if dummy is None:
dummy = Dummy(prefix)
self.dummies[prefix] = dummy
return dummy
def toto(self, prefix):
dummy = self._get_dummy(prefix)
return dummy.toto()
def titi(self, prefix):
dummy = self._get_dummy(prefix)
return dummy.titi()
def tata(self, prefix):
dummy = self._get_dummy(prefix)
return dummy.tata()
问题是,有超过 3 种方法,我希望它是自动的,这样我就不必在每次 Dummy 发生变化时更改我的 DynamicDummy。我以前从未使用过元类,所以也许它们是解决方案,但我不能让它们与 dummies 字典一起使用,这是一个实例属性。
我愿意寻求一种使其自动化的解决方案,但也愿意为“动态性”问题提供另一种解决方案。
【问题讨论】:
-
为什么没有像
get_name(self, name, prefix)这样的单一方法,而是像get_name('toto', 'some_prefix')那样调用它,而不是使用多个相同的方法?这适用于两个课程。 -
因为这是一个简化的例子,实际的方法是不一样的
-
即使在这种情况下,我仍然建议查看属性访问的自定义。
标签: python inheritance wrapper metaclass