美文网首页Python
强制子类重写父类中的方法

强制子类重写父类中的方法

作者: Rethink | 来源:发表于2020-10-09 20:11 被阅读0次

Python v3.7.0

方案一(推荐):定义抽象基类,只要把一个方法定义成抽象方法,那解释器就会要求子类必须重写这个方法,要注意的是,如果抽象方法没有被重写,那么子类在实例化时,就会抛出TypeError异常,而不需要等到调用函数。

import abc

class Animal(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def speak(self):
        pass

class Dog(Animal):
    def run(self):
        pass

if __name__ == '__main__':
    dog = Dog()

运行以上代码,会抛出异常:

TypeError: Can't instantiate abstract class Dog with abstract methods speak

只有在Dog子类中,重写speak方法,才可以正常实例化子类。

方案二:指定父类方法抛出NotImplementedError异常

class Animal1():
    def speak(self):
        raise NotImplementedError

class Dog1(Animal1):
    def run(self):
        pass

if __name__ == '__main__':
    dog = Dog1()
    dog.speak()

子类中若没有重写speak方法,也可以正常实例化,但是调用此方法时,就会抛出NotImplementedError异常;


补充:

  1. 在父类中定义的私有方法,其作用范围仅在当前类,若在子类中重写,实际上并不会起效果,原因:以双下划线前缀开头的属性或方法,Python解释器会重写其名称,以便在类被扩展的时候不容易产生冲突,这被称之为名称修饰(name mangling),如下所示:
class Test:
    def __init__(self):
        self.__foo = True

    def __bar(self):
        return "bar"

t = Test()
print(dir(t))
print(t._Test__foo)
print(t._Test__bar())

输出内容如下,注意列表前两个值,这同时也说明在Python中是没有绝对私有的变量或方法的。

['_Test__bar', '_Test__foo', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
True
bar
  1. 在类的继承中,如果在子类中重写了父类方法,但有时也希望能同时实现父类的功能,最常见的场景之一就是父类构造方法中的初始值无法被继承,可以在子类中使用super 函数来调用父类中的方法,特别是多重继承的情况;如下面的例子:
class Animal:
    def __init__(self):
        self.hungry = True

    def eat(self):
        if self.hungry:
            print('No!')
        else:
            print('Yes!')


class Bird(Animal):
    def __init__(self):
        self.song = '~~~'

    def sing(self):
        print(self.song)

bird = Bird()
bird.sing()   # 正常
bird.eat()    # 抛出异常:AttributeError: 'Bird' object has no attribute 'hungry'

解决的方法是在子类的构造函数中,使用super方法调用父类的构造函数,如下:

class Bird(Animal):
    def __init__(self):
        super().__init__()
        self.song = '~~~'

相关文章

  • 8,Python面向对象3

    重写父类方法 1. 重写父类方法 所谓重写,就是子类中,有一个和父类相同名字的方法,在子类中的方法会覆盖掉父类中同...

  • swift中子类重写父类的方法

    子类在主体中重写父类的方法 如果重写的父类方法在主体中,直接重写即可,如果重写的父类方法在extension中,父...

  • 2018-07-10

    JAVA重写的条件 条件: 子类继承父类,并重写父类的方法 1、 重写要求子类中的覆盖方法与父类中被覆盖的方法有...

  • 重写(=覆盖)、重载

    override(重写、覆盖): 子类在继承父类时,重写(重新实现)父类中的方法。 重写(覆盖)的规则: 重写方法...

  • 重载和重写

    重载:方法名一样,参数列表不同(同一个类) 重写:子类中,出现了和父类一样的方法,子类重写父类方法 重写 子类...

  • Java自学-接口与继承 隐藏

    Java中的方法隐藏 与重写类似,方法的重写是子类覆盖父类的对象方法 隐藏,就是子类覆盖父类的类方法 步骤 1 :...

  • 强制子类重写父类中的方法

    Python v3.7.0 方案一(推荐):定义抽象基类,只要把一个方法定义成抽象方法,那解释器就会要求子类必须重...

  • 类的定义与继承

    类 类的继承 重写,子类可以重写父类的方法和属性 子类里,如果重写了父类的方法后,如果还想调用父类的方法,通过su...

  • 对于重写和调用父类的方法

    所谓的重写就是子类中,有一个和父类相同的名字的方法,在子类中的方法会覆盖掉父类的同名的方法 重写 调用父类的方法:

  • 子类继承父类函数

    如果在子类中需要父类的构造方法就需要显式地调用父类的构造方法,或者不重写父类的构造方法。子类不重写 init,实例...

网友评论

    本文标题:强制子类重写父类中的方法

    本文链接:https://www.haomeiwen.com/subject/tbhrpktx.html