Python元类和特殊方法

Python元类和特殊方法,python,metaclass,Python,Metaclass,我尝试使用元类来生成带有自定义特殊方法的类,特别是调用。类的生成取决于调用构造函数时使用的参数。我遇到了一个奇怪的效果,简化的例子如下: def trick(self, *args, **kwargs): print "Works!" class Test1Factory(type): def __new__(mcls, name, bases, namespace): namespace['__call__'] = trick return t

我尝试使用元类来生成带有自定义特殊方法的类,特别是调用。类的生成取决于调用构造函数时使用的参数。我遇到了一个奇怪的效果,简化的例子如下:

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!"
它可以工作,但并没有真正的用处,因为在_unew_;中无法访问构造函数参数。键入.\uuuuu call\uuuuuu应执行以下操作:

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相似。调用,但这里不是这样。使用类的_new__静态方法也可以实现同样的效果。我有一个根本不使用元类的解决方案,只是想了解现象。Python版本是2.7.5

错误的假设可能是“实例与实例相似。调用”,因为不是在实例中查找,而是在实例的类型中查找。也就是说,所使用的_调用不是instance的调用,而是instance._类或typeinstance的调用

单独在实例上定义的任何_调用_属性都可以作为任何其他属性定期访问,但当在实例中调用实例时不会使用。这是Python语义的一部分

试着在实例和它的类型上定义一个_u调用,看看你得到了什么


如果我正确理解了这个问题,那么这个问题的背景与我之前的另一个问题相同,并且在问题的帖子中总结了答案,并通过实验进行了演示:“。

特殊方法是在类中查找的,而不是在实例中。可能重复@Aश威尼च豪宅——是的,这回答了这个问题。使用调度是我的解决办法,我想这是唯一的办法。