zoukankan      html  css  js  c++  java
  • Python知识补充

    一、类方法的强制重写与禁止重写

    1、强制重写

    需求:父类的一个方法,强制子类去重写

    方式一:

    把父类变成抽象基类,然后给指定的方法加上装饰器@abc.abstractmethod

    import abc
    
    
    class Animal(metaclass=abc.ABCMeta):
        @abc.abstractmethod
        def speak(self):
            pass
    
    
    class Dog(Animal):
        def speak(self):
            print('汪汪叫')
    
    
    class Cat(Animal):
        pass
    
    
    d = Dog()
    d.speak()
    
    c = Cat()
    c.speak()

     方式二:

    指定方法排除NotlmplementedError异常

    import abc
    
    
    class Animal(metaclass=abc.ABCMeta):
        @abc.abstractmethod
        def speak(self):   # 给父类的speak方法加上异常语句,它会帮我们检测,这个方法在子类中有没有被重新实现,如果没有,则抛出异常
            raise NotImplementedError
    
    
    class Dog(Animal):
        def speak(self):
            print('汪汪叫')
    
    
    class Cat(Animal):
        pass
    
    
    d = Dog()
    d.speak()
    
    c = Cat()
    c.speak()

     2、禁止重写

    其实这个说法也不太准确,实际是可以重写的,但是无法生效而已

    先看下面的常规例子:

    class Base:
        def go(self):
            print("base")
    
        def run(self):
            self.go()
    
    
    class Extend(Base):
        def go(self):
            print("extend")
    
    
    p = Extend()
    p.run()  >> extend

    输出结果很正常,和我们预期的一样

    接着我们借助私有函数,私有函数的作用范围仅在当前类。

    class Base:
        def __go(self):
            print("base")
    
        def run(self):
            self.__go()
    
    
    class Extend(Base):
        def __go(self):
            print("extend")
    
    
    p = Extend()
    p.run()  >>base

    仔细观察,区别只是一个是公开函数,一个是私有函数,其表象上可以被重写,但是实际上并无重写的效果。

  • 相关阅读:
    使用bootstrap中的toolTip插件时 最上方提示会被遮挡问题
    Vue中splice的使用
    由于eslint语法检查工具限制很严格,导致启动项目是报错的解决办吧(使用cmder工具时发生的错误)
    windows命令行工具—Cmder配置
    mui触发自定义事件(子页面返回传递给父级页面值)
    计算最长英语单词链
    周总结14
    找水王
    用户体验评价
    周总结13
  • 原文地址:https://www.cnblogs.com/huiyichanmian/p/12402136.html
Copyright © 2011-2022 走看看