我正在创建一个小型个人项目,在那里我创建了许多课程。每个类都有自己的寄存器,包含其所有实例:
class IterReg(type):
# Register of all objects for iteration
def __iter__(cls):
return iter(cls._reg.values())
"模板"我用于每个班级的是
class Point(object):
# Point object
__metaclass__ = IterReg
_reg = dict()
counter = 0
# Initialize
def __init__(self, name):
self.name = name
self._reg[self.name] = self
Point.counter += 1
# Return register keys
@staticmethod
def get_reg_keys(cls):
return cls._reg.keys()
还有一些(对于MWE来说不重要)的东西。
如果我初始化,例如a = Point("Point A")
,我可以调用:
>>> a.get_reg_keys()
['Point A']
(显然)与我从
获得的结果相同Point.get_reg_keys()
现在我的问题是:有没有办法为所有类定义此方法一次(即以某种方式在metaclass
中)。
我首先想到这样的事情有效:
class IterReg(type):
# Register of all objects for iteration
def __iter__(cls):
return iter(cls._reg.values())
def get_reg_keys(cls):
return cls._reg.keys()
但是我可以从课程中调用get_reg_keys()
(即Point.get_reg_keys()
),而不是从任何实例调用。{/ p>
答案 0 :(得分:1)
您可以定义一个具有.get_reg_keys()
的泛型类,并在您想要使用该方法时将其子类化。在下面的示例中,任何继承自Generic
的类都将使用.get_reg_keys()
方法。
class IterReg(type):
# Register of all objects for iteration
def __iter__(cls):
return iter(cls._reg.values())
class Generic(object):
@classmethod
def get_reg_keys(cls):
return cls._reg.keys()
class Point(Generic):
# Point object
__metaclass__ = IterReg
_reg = dict()
counter = 0
# Initialize
def __init__(self, name):
self.name = name
self._reg[self.name] = self
Point.counter += 1
a = Point('Point A')
a.get_reg_keys()
# returns:
['Point A']