繁体   English   中英

Python元类和特殊方法

[英]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__属性都可以像其他任何属性一样定期访问,但是在instanceinstance调用为instance()时将不使用。 这是Python语义的一部分。

尝试同时在实例及其类型上定义__call__ ,然后看看会得到什么。

如果我正确理解了这个问题,那么这个问题与另一个问题具有相同的背景,并且会得到一个答案(在问题的帖子中进行了总结,并通过实验进行了演示):“ Python如何分辨“这被称为函数” ? ”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM