我有一个可调用的类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
的子类?
答案 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