知识就是力量

当前位置:首页 > 技巧


python子类删除父类方法_强制子类用Python覆盖父类,好简单!

2022-10-11

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 = '~~~'