【问题标题】:Define methods for multiple classes为多个类定义方法
【发布时间】: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


【解决方案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']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    • 2021-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    相关资源
    最近更新 更多