Ich versuche herauszufinden, wie sichergestellt werden kann, dass eine Methode einer Klasse, die von einem ABC erbt, mit dem entsprechenden Decorator erstellt wird. Ich verstehe (hoffentlich), wie ABCs im Allgemeinen funktionieren.Erzwingen ABCs method decorators?
from abc import ABCMeta, abstractmethod
class MyABC(metaclass=ABCMeta):
@abstractmethod
def my_abstract_method(self):
pass
class MyClass(MyABC):
pass
MyClass()
Das gibt "Typeerror: nicht abstrakte Klasse MyClass mit abstrakten Methoden my_abstract_method instanziiert Can". Großartig, macht Sinn. Erstellen Sie einfach eine Methode mit diesem Namen.
class MyClass(MyABC):
def my_abstract_method(self):
pass
MyClass()
Boom. Sie sind fertig. Aber was ist mit diesem Fall?
Der MyClass() -Aufruf funktioniert, obwohl my_attribute keine Eigenschaft ist. Ich denke, am Ende stellen alle ABCs sicher, dass eine Methode mit einem bestimmten Namen existiert. Das ist es. Wenn Sie mehr davon möchten, müssen Sie sich den Quellcode von MyABC ansehen und die Dokumentation lesen. Die Dekoratoren und Kommentare dort werden Sie darüber informieren, wie Sie Ihre Unterklasse konstruieren müssen.
Habe ich es richtig oder fehle ich hier etwas?
Dafür steht 'abstractproperty'. – user2357112
'' abstractproperty'' war in Python 3.3 veraltet. OP hat die korrekte Verwendung für 3.3+; '' property'' und '' abstractmethod'' zusammen in der Basisklasse mit '' property'' in der Unterklasse. Sie können Unterklassen jedoch nicht implementieren, um sie korrekt zu implementieren. –