【问题标题】:How can I call the metaclass's __call__?如何调用元类的 __call__?
【发布时间】:2014-08-11 05:08:24
【问题描述】:

鉴于以下关于 X 类实例的示例:

class X():

    def __call__(self, incoming_list):
        print incoming_list

X()([x for x in range(10)])

如何使用类本身而不是实例的__call__ 魔术方法获得相同的输出?示例:

X([x for x in range(10)]) 

直接调用,好像传递给__init__。但是,在它调用__call__ 之前调用__new__ 将参数传递给__init__。我怎样才能访问那个“元类__call__”?有可能吗?

为了更容易理解,这给了我相同的输出:

class X:

    def __call__(self, incoming_list):
        print incoming_list

X().__call__([x for x in range(10)])

我想要这样的东西:

class X:

    def X.__call__(incoming_list): # Syntax Error
        print incoming_list

X.__call__([x for x in range(10)])

【问题讨论】:

  • 你的元类在哪里?
  • 我不明白你想在这里实现什么。 def foo(xs): print(xs); foo([x for x in range(10]);你真的用这些神奇的东西做什么?
  • ...您是否尝试过实际使用元类而不是在问题中随机提及它?
  • “如果你不知道元类是什么,那么你不需要它们的概率是 99%。”
  • 一个类没有可以覆盖的__call__。类构造函数称为__new__

标签: python class call metaclass


【解决方案1】:

我觉得你想的太复杂了。

可能你想要类似的东西

class X:
    def __init__(self, incoming_list):
        self.data = incoming_list # to keep them for later, if needed
        print incoming_list

X([x for x in range(10)])

一切都没有元类,只是在类的定义上。

如果你需要一个元类,你可以这样做

class MC(type):
    def __call__(self, *a, **k):
    super(MC, self).__call
        print a, k
        r = super(MC, self).__call__(*a, **k)
        print "R", r
        return r

class X(object):
    __metaclass__ = MC
    def __init__(self, x): print "Init", x

使用它

>>> X(1)
(1,) {}
Init 1
R <__main__.X object at 0x00000000022907B8>
<__main__.X object at 0x00000000022907B8>

显示元__call__ 被调用,而后者又调用__init__

但我确信你不需要那个,你只想要__init__

【讨论】:

  • 谢谢!我知道我不需要它,我只是好奇,而这正是我想知道的。
  • 在 OP 的情况下可能是 __new__ 而不是 __init__
猜你喜欢
  • 2015-08-31
  • 1970-01-01
  • 2012-09-02
  • 2011-12-10
  • 1970-01-01
  • 2018-01-14
  • 1970-01-01
  • 2011-10-21
  • 2011-11-21
相关资源
最近更新 更多