定义多个类的方法

时间:2017-07-19 11:22:18

标签: python python-2.7 class methods

我正在创建一个小型个人项目,在那里我创建了许多课程。每个类都有自己的寄存器,包含其所有实例:

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>

1 个答案:

答案 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']