python子类删除父类方法_强制子类用Python覆盖父类,好简单!
Python v3.7.0
选项 1(推荐)
定义一个抽象基类。只要将方法定义为抽象方法,解释器就会要求子类覆盖该方法。需要注意的是,如果抽象方法没有被覆盖,那么子类就会被实例化。不等到函数被调用就抛出 TypeError 异常。
进口abc
classAnimal(metaclass=abc.ABCMeta):@abc.abstractmethoddefspeak(self):pass
类狗(动物):defrun(自我):通过
if__name__ == '__main__':dog = 狗
运行上面的代码会抛出异常:
TypeError:不能用抽象方法实例化抽象类 Dog
只有在Dog子类中,重写speak方法,子类才能正常实例化。
选项二
指定的父类方法抛出 NotImplementedError 异常
classAnimal1:defspeak(self):raiseNotImplementedError
classDog1(Animal1):defrun(self):pass
if__name__ == '__main__':dog = Dog1dog.speak
如果子类没有重写speak方法,可以正常实例化,但是调用该方法时,会抛出NotImplementedError异常。
补充
父类中定义的私有方法的作用域只在当前类中。如果在子类中被覆盖,它实际上不会生效。原因:以双下划线前缀开头的属性或方法将被 Python 解释器重写。将其名称写入以便在扩展类时不会轻易发生冲突称为名称修改,如下所示:
classTest:def__init__(self):self.__foo = True
def__bar(self):return "bar"
t = Testprint(dir(t))print(t._Test__foo)print(t._Test__bar)
输出如下,注意列表的前两个值python 父类方法吗,这也意味着Python中没有绝对私有的变量或方法。
['_Test__bar','_Test__foo','__class__','__delattr__','__dict__','__dir__','__doc__','__eq__','__format__','__ge__','__getattribute__'python 父类方法吗,'__gt__',' __hash__','__init__','__init_subclass__','__le__','__lt__','__module__','__ne__','__new__','__reduce__','__reduce_ex__','__repr__','__setattr__','__sizeof__' , '__str__', '__subclasshook__', '__weakref__']Truebar
在类继承中,如果父类的方法在子类中被重写,但有时父类的功能也期望同时实现,最常见的场景之一就是父类中的初始值构造函数不能被继承,可以使用子类中的超函数调用超类中的方法,特别是在多重继承的情况下;如下例所示:
classAnimal:def__init__(self):self.hungry = True
失败(自我):如果自己。饿了:打印('不!')否则:打印('是!')
classBird(Animal):def__init__(self):self.song = '~~~'
defsing(self):print(self.song)
bird = Birdbird.sing # normal bird.eat # 抛出异常:AttributeError: 'Bird' object has no attribute 'hungry'
解决方法是在子类的构造函数中使用super方法调用超类的构造函数,如下:
classBird(Animal):def__init__(self):super.__init_ _self.song = '~~~'