1

我有一个A可调用的类。我还有一个A被调用的子类B,我想让它不可调用。TypeError当我尝试调用它时,它应该引发正常的“不可调用” 。

class A():
    def __call__(self):
        print "I did it"

class B(A):
    def __call__(self):
        raise TypeError("'B' object is not callable")

正如你所看到的,我现在的解决方案是复制一个正常的TypeError. 这感觉不对,因为我只是在复制标准 python 异常的文本。如果有办法将子类标记为不可调用,然后让 python 处理该属性,那会更好(在我看来)。

B鉴于它是可调用类的子类,使类不可调用的最佳方法是什么A

4

1 回答 1

1

您可以使用 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
于 2013-07-19T16:24:28.533 回答