python - 为多个类定义方法

标签 python python-2.7 class methods

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

class IterReg(type):
    # Register of all objects for iteration
    def __iter__(cls):
        return iter(cls._reg.values())

我为每个类使用的"template"是

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()

现在我的问题是:有没有一种方法可以为所有类定义一次该方法(即在元类中)。 我首先认为这样的方法有效:

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()

但是我可以从类(即 Point.get_reg_keys())调用 get_reg_keys() 而不是从它的任何实例。

最佳答案

您可以定义一个具有 .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']

关于python - 为多个类定义方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45189066/

相关文章:

python - 如何在 python 中创建字典数组/列表?

javascript - 在数组中搜索类属性为 true 的 lastIndexOf

python - 两个已知维度的 numpy 数组的点积未达到预期的维度

python - Django 的加载数据在有效日期给出 ValidationError

python - 重新排序两个 pandas DataFrame 列中的选择项

python - 对字典/列表列表中的多个参数进行排序

python - 为python进程保留ram

Python2 __base__ 和 super

c# - 将 WPF 控件类作为模板类

python - 多处理:如何在使用 pool.map 时为每个实例编写单独的日志文件?