可调用类的不可调用子类

时间:2013-07-19 14:26:05

标签: python inheritance callable

我有一个可调用的类A。我还有一个名为A的{​​{1}}子类,我想让它不可调用。当我尝试调用它时,它应该提升正常的“不可调用”B

TypeError

正如您所看到的,我现在的解决方案是提出正常class A(): def __call__(self): print "I did it" class B(A): def __call__(self): raise TypeError("'B' object is not callable") 的副本。这感觉不对,因为我只是复制标准python异常的文本。如果有一种方法可以将子类标记为不可调用,然后让python处理该属性,那将会更好(在我看来)。

使TypeError类不可调用的最佳方法是什么,因为它是可调用类B的子类?

1 个答案:

答案 0 :(得分:0)

您可以使用Python元类覆盖类型创建。在创建对象之后,我将父项的__call__方法替换为抛出异常的另一个方法:

>>> class A(object):
    def __call__(self):
        print 'Called !'


>>> class MetaNotCallable(type):
    @staticmethod
    def call_ex(*args, **kwargs):
            raise NotImplementedError()

    def __new__(mcs, name, bases, dict):
        obj = super(MetaNotCallable, mcs).__new__(mcs, name, bases, dict)
        obj.__call__ = MetaNotCallable.call_ex # Change method !
        return obj


>>> class B(A):
    __metaclass__ = MetaNotCallable


>>> a = A()
>>> a()
Called !
>>> b = B()
>>> b()

Traceback (most recent call last):
  File "<pyshell#131>", line 1, in <module>
    b()
  File "<pyshell#125>", line 4, in call_ex
    raise NotImplementedError()
NotImplementedError