我怎样才能调用元类的__call__?

时间:2014-06-20 12:29:37

标签: python class call metaclass

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)])

1 个答案:

答案 0 :(得分: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__