sad*_*ave 5 python oop inheritance superclass python-3.x
我有一个扩展基类的类。实例化后,我想检查子类是否具有从其基础实现的类之一,但我不确定最好的方法。 hasattr(self, '[method]')如果孩子没有实现,则返回 super 的方法,所以我试图区分两者。
这是一个例子:
class Base :
def __init__ ( self,) :
pass
def fail (self,) :
pass
# Now create the subclass w/o .fail
class Task ( Base ) :
def __init__ ( self, ):
print( hasattr( self, 'fail' ) ) # < returns True
Run Code Online (Sandbox Code Playgroud)
当Task()实例化时,它会打印, True因为Task继承.fail自Base. 但在这种情况下,我想知道Task Does Not Implement .fail,所以我想要False以某种方式返回。看来我正在寻找类似的东西isimplemented( self, 'fail' )。我缺少什么?
我不确定我理解是否正确,但听起来您可能正在寻找抽象基类。(文档在这里,教程在这里abstractmethod。)如果您在继承自 的基类中指定 an abc.ABC,则尝试实例化子类将失败,除非该子类重写抽象方法。
from abc import ABC, abstractmethod\n\nclass Base(ABC):\n @abstractmethod\n def fail(self):\n pass\n\nclass Task(Base):\n pass\n \nclass Task2(Base):\n def fail(self):\n pass\n\n# this raises an exception\n# `fail` method has not been overridden in the subclass.\nt1 = Task()\n\n# this succeeds\n# `fail` method has been overridden in the subclass.\nt2 = Task2()\nRun Code Online (Sandbox Code Playgroud)\n如果您希望在类定义时而不是实例实例化时进行检查,另一种选择是在基类中编写一个__init_subclass__方法,每次对基类进行子类化或对从基类继承的类进行子类化时都会调用该方法。(您不必在__init_subclass__\xe2\x80\x94 中引发异常,您只需添加一个fail_overriden向类添加一个布尔属性,或者做任何您真正喜欢的事情。)
class Base:\n def fail(self):\n pass\n\n def __init_subclass__(cls, **kwargs):\n if cls.fail == Base.fail:\n raise TypeError(\n \'Subclasses of `Base` must override the `fail` method\'\n )\n super().__init_subclass__(**kwargs)\n\n\n# this class definition raises an exception\n# because `fail` has not been overridden\nclass Task(Base):\n pass\n\n\n# this class definition works fine.\nclass Task2(Base):\n def fail(self):\n pass\nRun Code Online (Sandbox Code Playgroud)\n如果您只想让每个实例告诉您是否fail在其子类中被覆盖,您可以这样做:
class Base:\n def __init__(self):\n print(type(self).fail != Base.fail)\n\n def fail(self):\n pass\n\nclass Task(Base):\n def __init__(self):\n super().__init__()\n \nclass Task2(Base):\n def __init__(self):\n super().__init__()\n\n def fail(self):\n pass\n\nt1 = Task() # prints "True"\nt2 = Task2() # prints "False"\nRun Code Online (Sandbox Code Playgroud)\n