12

たとえば、サブクラスによって実装されるいくつかのメソッドを使用して、Pythonで抽象クラスを作成するとします。

class Base():
    def f(self):
        print "Hello."
        self.g()
        print "Bye!" 

class A(Base):
    def g(self):
        print "I am A"

class B(Base):
    def g(self):
        print "I am B"

f()基本クラスがインスタンス化され、そのメソッドが呼び出されると、self.g()が呼び出されると、サブクラスがメソッドを実装する必要があることを通知する例外がスローされるようにしたいと思いますg()

ここで通常行うことは何ですか?私はそれを上げるNotImplementedError?必要がありますか、それともそれを行うためのより具体的な方法がありますか?

4

3 に答える 3

15

Python 2.6 以降では、abcモジュールを使用しBaseて「実際に」抽象基底クラスを作成できます。

import abc

class Base:
    __metaclass__ = abc.ABCMeta
    @abc.abstractmethod
    def g(self):
        pass
    def f(self): # &c

これにより、サブクラスが実装で使用できるようにするという@Aaronの目標を満たしながらBase、インスタンス化できないこと、およびオーバーライドに失敗したサブクラスもできないことが保証されます。全体として、Python 2.5 以前で使用していたものよりもはるかに優れたソリューションです!gsuperg

補足: とにかくメタクラスを明示的に設定する必要があるため、Base をオブジェクトから継承するのは冗長です。

于 2010-08-13T03:58:50.603 に答える
2

何もしないが、インターフェースを説明するdocstringを持っているメソッドを作成します。を取得することNameErrorは混乱を招き、レイズNotImplementedError(またはその他の例外)は。の適切な使用法を損なうことになりますsuper

于 2010-08-13T03:28:03.187 に答える
0

Peter Norvig は、Python のよくある質問リストで、これに対する解決策を提供しています。ここで再現します。IAQ を確認してください。非常に便利です。

## Python
class MyAbstractClass:
    def method1(self): abstract

class MyClass(MyAbstractClass): 
    pass

def abstract():
    import inspect
    caller = inspect.getouterframes(inspect.currentframe())[1][3]
    raise NotImplementedError(caller + ' must be implemented in subclass')
于 2010-08-13T04:30:48.920 に答える