在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)])
答案 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__
。