1

A呼び出し可能なクラスがあります。また、 callable にしないようにしたいAcalledのサブクラスもあります。呼び出そうとすると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 に答える