【问题标题】:python custom metaclass call method relation with classespython自定义元类调用方法与类的关系
【发布时间】:2017-07-15 16:22:49
【问题描述】:

我正在尝试了解 python metaclassclass 之间的关系。我正在尝试创建单例类并找到此代码

class SingleTon(type):
    def __call__(self, *args, **kwargs):
        if self._instances is None:
            self._instances = super(SingleTon, self).__call__(*args, **kwargs)
        return self._instances

class Counter:
    __metaclass__ = SingleTon
    _instances = None
    def __init__(self):
        self.count = 1
c = Counter()

我的问题是如何使用 metaclass 创建计数器类对象。我知道 metaclass call 方法会在我们创建对象时被调用,但这里的混淆是这段代码 super(SingleTon, self).__call__(*args, * *kwargs) 在这里。请解释。这将是非常可观的。

【问题讨论】:

    标签: python python-2.7 python-3.x


    【解决方案1】:

    super 只会将参数转发给负责类创建的type.__call__

    这就像只是现在在“正常”类层次结构中调用super,你是在元类中调用它。因为SingleTontype 的子类,所以它会被调用。在类场景中,您(通常)会将调用转发到基类 object

    【讨论】:

    • 所以,这意味着我可以直接使用 type 而不是 super ??
    • 是的,试试看! (不过,也可以通过 self)。不过,这胜过使用super 的意义(您是硬编码名称)。
    • 非常感谢吉姆。请清除另一件事类型(元类)方法调用负责创建实例对象。那么它又是如何创建类的呢?
    • @dheerajsaini 老实说,这是一个加载的问题:-)。为了尽量简短:type.__call__ 处理这两种情况,具体取决于传递给它的内容,type.__new__/__init__(或一般mymetaclass.__new__/__init__)将被调用类或object.__new__/__init__ 或(@987654333 @) 用于实例。
    猜你喜欢
    • 2019-03-22
    • 1970-01-01
    • 2016-09-07
    • 1970-01-01
    • 1970-01-01
    • 2022-11-19
    • 1970-01-01
    • 2019-12-28
    • 1970-01-01
    相关资源
    最近更新 更多