【发布时间】:2017-12-24 15:17:24
【问题描述】:
我正在从事一个小型个人项目,我在其中创建了许多课程。每个类都有自己的寄存器,其中包含其所有实例:
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()),而不是从它的任何实例中调用。
【问题讨论】:
-
为什么不直接创建一个基类(比如
RegisteredBase),其中包含您的get_reg_keys方法和通用__init__方法?然后从那个子类中继承你的Point类。 -
Point.get_reg_keys()是调用该静态函数的正确方法
标签: python python-2.7 class methods