元类的有用基类

metaclass的Python项目详细描述


元类是python中非常强大的工具。你可以控制 整个类的创建过程。

然而,大多数时候,它们太强大了。此模块有助于 使用元类的一些优点,而不必 去了解所有的细节。它定义了一个基类子类。 从这个类继承可以修改子类的创建 过程。

初始化子类

元类的一个非常常见的用例是您只想执行 创建类后的一些代码。这样做很容易 SubclassInit。你只需定义一个方法__init_subclass__, 它被隐式地认为是@classmethod和 将在生成的每个子类之后调用 上课。作为参数,它获取类的命名空间。一个例子 是一个简单的子类注册:

class Register(SubclassInit):
    subclasses = []

    def __subclass_init__(cls, ns, **kwargs):
        super().__subclass_init__(ns, **kwargs)
        Register.subclasses.append(cls)

注意如何添加关键字参数。这些是关键词 在类定义行上给出的参数,如:

class Subclass(Base, spam="ham"):
    pass

别忘了正确地调用super()!其他类可能希望 初始化子类。这也是为什么你应该过去 关键字参数,去掉你需要的。

初始化描述符

描述符是创建对象属性的强大技术,对象属性 快速计算它们的价值。属性就是这样一个简单的例子 描述符。这些描述符有一个共同的问题:它们 不知道他们的名字。使用SubclassInit可以添加 __init_descriptor__方法调用一次 类已就绪,并且描述符的名称已知。

例如,我们可以定义一个描述符,使属性 弱引用:

import weakref

class WeakAttribute:
    def __get__(self, instance, owner):
        return instance.__dict__[self.name]()

    def __set__(self, instance, value):
        instance.__dict__[self.name] = weakref.ref(value)

    def __init_descriptor__(self, owner, name):
        self.name = name

属性顺序

有时人们对属性的定义顺序感兴趣 在课堂上。SubclassInit留下一个元组,其中包含 属性定义为类属性的顺序称为 __attribute_order__。注意,python已经定义了一些类 属性,如__module__,其中一些也显示在 元组。

例如:

class AttributeOrder(SubclassInit):
    a = 1

    def b(self):
        pass

    c = 5

assert AttributeOrder.__attribute_order__ == \
    ('__module__', '__qualname__', 'a', 'b', 'c')

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java使用ApachePOI将excel文件导入postgreSQL表   java多线程从iText pdf提取文本   winapi Java和SetWindowDisplayAffinity   eclipse juno的java Websphere 6.1插件   java MPAndroidChart:为Y轴提供一些偏移   java中作为参数传递枚举类型的继承   java Gui jframe的工作原理与netbeans不同   使用Bouncy Castle和PDFBox在Java中验证PDF签名   优化缩小Java代码   java无法在安卓中从Firebase取回子数据   返回的java方法?我应该什么时候用?   java错误处理已完成,退出代码为1。与穿过阵列的for循环有关   多线程Java volatile是否阻止缓存或强制执行写缓存?   java Multi-collectItems如何提前终止并返回已收集的项目   java为什么不在服务(请求,响应)中直接调用processRequest(请求,响应)?   java如何从字符串生成int数组?   打印获取用户输入的值并在其他预选文本中显示。JAVA   未显示java DynamicAsper UTF8字符   java Eclipse RCP:不启动应用程序的命令行参数