[英]Python metaclasses and special methods
我尝试使用元类以使用自定义特殊方法(特别是__call__
生成类。 类的生成取决于调用构造函数的参数。 我遇到了一个奇怪的效果,简化示例如下:
def trick(self, *args, **kwargs):
print "Works!"
class Test1Factory(type):
def __new__(mcls, name, bases, namespace):
namespace['__call__'] = trick
return type.__new__(mcls, name, bases, namespace)
class Test1(object):
__metaclass__ = Test1Factory
def __init__(self, value):
self._value = value
t1 = Test1(1)
t1() # "Works!"
它有效,但并不是真正有用,因为在__new__
无法访问构造函数参数。 type.__call__
应该可以解决问题:
import types
class Test2Factory(type):
def __call__(self, *args, **kwargs):
obj = type.__call__(self, *args, **kwargs)
setattr(obj, '__call__', types.MethodType(trick, obj, Test2))
return obj
class Test2(object):
__metaclass__ = Test2Factory
def __init__(self, value):
self._value = value
t2 = Test2(2)
t2.__call__() # "Works!"
t2() # TypeError: 'Test2' object is not callable
据我了解, instance()
与instance.__call__()
类似,但在这里情况并非如此。 使用类的__new__
静态方法执行相同的操作。 我有一个解决方法,它根本不使用元类,而只是想了解这种现象。 Python版本是2.7.5
错误的假设可能在“ instance()
与instance.__call__()
相似”中,因为__call__
不是在instance
查找,而是在instance的类型中查找。 也就是说,使用的__call__
不是instance
的__call__
,而是instance.__class__
或type(instance)
的__call__
。
单独在instance
上定义的任何__call__
属性都可以像其他任何属性一样定期访问,但是在instance
被instance
调用为instance()
时将不使用。 这是Python语义的一部分。
尝试同时在实例及其类型上定义__call__
,然后看看会得到什么。
如果我正确理解了这个问题,那么这个问题与另一个问题具有相同的背景,并且会得到一个答案(在问题的帖子中进行了总结,并通过实验进行了演示):“ Python如何分辨“这被称为函数” ? ”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.