【问题标题】:Special usage of metaclasses in pythonpython中元类的特殊用法
【发布时间】:2014-07-15 19:19:09
【问题描述】:

我在搞乱 python 元类,发现了一些我不知道存在或有效的非常有趣的东西:

class Meta(type):
    def __new__(metacls, name, bases, kwargs, extra_thing=None):
        if extra_thing is not None:
            print(extra_thing)
        return super().__new__(metacls, name, bases, kwargs)
    def __init__(metacls, name, bases, kwargs, *args, **kwargs_):
        super().__init__(metacls, name, bases, kwargs)

class TestClass(metaclass=Meta, extra_thing='foo'):
    pass

当你运行它时,'foo' 会被打印出来。

显然,如果它们的元类允许,类可以有额外的关键字参数。

如果发现此功能可能有用的场景,是否可以利用它?还是应该将其单独保留以支持其他方法(例如定义类范围的变量 extra_thing)?

【问题讨论】:

  • 你说的“还好吗”是什么意思?你的意思是“我可以依赖的记录在案的行为”还是“它是好的设计”?

标签: python class metaclass


【解决方案1】:

行为是documented,所以它可能是安全的,如果可能会让阅读您的代码的其他程序员感到困惑。文档是这样说的:

在类定义中指定的任何其他关键字参数都将传递给下面描述的所有元类操作。

它描述的“操作”是__prepare__ 并调用元类本身(通常会调用元类的__new__ 和/或__init__ 方法)。

【讨论】:

    猜你喜欢
    • 2014-05-14
    • 1970-01-01
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多