定义多个类的方法 [英] Define methods for multiple classes

查看:148
本文介绍了定义多个类的方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm working on a small personal project where I created many classes. Each class has its own register containing all its instances:

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

我在每个班级使用的模板"是

The "template" which I use for each class is

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"),则可以调用:

And some other (not important for a MWE) stuff. If I initialize, e.g., a = Point("Point A"), I can then call:

>>> a.get_reg_keys()
['Point A']

(显然)与我得到的结果相同

which is (obviously) the same result that I get from

Point.get_reg_keys()

现在我的问题是:是否有一种方法可以为所有类一次定义此方法(即在metaclass中以某种方式). 我首先认为这样的方法行得通:

Now my question: is there a way to define this method once for all classes (i.e. somehow in the metaclass). I first thought something like this had worked:

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

But then I can just call get_reg_keys() from the class (i.e. Point.get_reg_keys()) and not from any instance of it.

推荐答案

您可以定义具有.get_reg_keys()的泛型类,并在要使用该方法时将其子类化.在下面的示例中,任何从Generic继承的类都将具有.get_reg_keys()方法.

You can define a generic class that has .get_reg_keys() and subclass it when you want to use that method. In the below example, any class that inherits from Generic will have the .get_reg_keys() method.

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

这篇关于定义多个类的方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆