python - 如何创建一个简单的元类?

标签 python class factory metaclass

我已经使用 Python 一段时间了,我总能稍微理解元类的含义,但我从来不需要元类。 现在我认为我的问题的最佳解决方案是元类(如果有更好的方法,请纠正我)。

我要创建的是一个系统,它会自动为我的每个类添加一个类变量 n 和一个列表 instances。这是一个类的简化示例:

class Foo:
    n = 0
    instances = []

    def __init__(self):
        self.index = Foo.n
        Foo.n += 1
        Foo.instances.append(self)

这个结构应该为我的 7 或 8 个类实现,我在想元类可能会在这里帮助我。 我知道我可以使用 Foo.__metaclass__ = MyMetaclass 属性来使用元类,但我如何创建元类?

最佳答案

实际上,在这里使用基类会更好:

class InstancesList(object): 
    def __new__(cls, *args, **kw):
        if not hasattr(cls, 'instances'):
            cls.instances = []
        return super(InstancesList, cls).__new__(cls, *args, **kw)

    def __init__(self):
        self.index = len(type(self).instances)
        type(self).instances.append(self)

class Foo(InstancesList):
    def __init__(self, arg1, arg2):
        super(Foo, self).__init__()
        # Foo-specific initialization

关于python - 如何创建一个简单的元类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15836263/

相关文章:

wpf - F# 可区分联合和 WPF 数据绑定(bind)

java - 这宣告了什么?

python - Spark Data Frames - 检查列是否为整数类型

python - 用 Python 在给定目录及其子目录中递归替换文件中的字符串?

python - 使用 pip 安装 SciPy 和 NumPy

c++ - 模板类 : unable to match function definition to an existing declaration

javascript - AngularJS - 如何从 json 响应中提取两条数据并在选择(组合框)中使用它们?

java - 工厂返回通用接口(interface)

c# - 我的 DDD 工厂类中应该有哪些方法?

python - Networkx 和 graphviz 布局将节点放置在同一位置