が上書きされます空のメソッドを置く、ない多くのポイントが存在しませんが、Cat
は、実際の抽象クラスだったとsound
であった場合は、 上書きされるをinforcedた方法は、それからの大きな利点は、たとえば、そこにある:
import abc
class Cat(abc.ABC):
def __init__(self, breed):
self.breed = breed
@abc.abstractmethod
def sound(self): # having this as an abstract method DOES make a difference
pass
class Scotish(Cat):
def sonud(self):
print('meowww')
Scotish
を初期化しようとしたとき、あなたがタイプミスに気づいたかどうかは、あなたがこのエラーになります:
>>> b = Scotish("scotish")
Traceback (most recent call last):
File "<pyshell#12>", line 1, in <module>
b = Scotish("scotish")
TypeError: Can't instantiate abstract class Scotish with abstract methods sound
奇妙なあいまいなエラーが発生する前に、実際に何が間違っているのかが分かります。
また、単純にraise NotImplementedError
とは異なり、抽象メソッドには抽象的なコードも含まれています。関数がやるかもしれないものの例のように、偉大な例では、_collections_abc.Generator.throw
次のようになります。
@abstractmethod
def throw(self, typ, val=None, tb=None):
"""Raise an exception in the coroutine.
Return next yielded value or raise StopIteration.
"""
if val is None:
if tb is None:
raise typ
val = typ()
if tb is not None:
val = val.with_traceback(tb)
raise val
これは実際のコードではありません、これは発電機が実際にthrow
メソッドを処理する方法はありませんが、それはの偉大抽象です議論を少なくとも処理する方法!
'abc'モジュールをチェックすると、これをバリエーションとして使用して便利なエラーチェックができます。 –