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

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

  • 相关阅读:
    ubuntu安装docker-compose
    docker-compose常用命令(持续更新...)
    docker运行jpress
    gcc -o选项:指定输出文件
    gcc -c:只编译不链接,仅生成目标文件
    WMWare下安装centOS7,并使用xshell进行连接记录.
    主线程和子线程多种情况小探讨
    Sleep的本质
    为什么要对多线程进行加锁操作呢
    list操作相关总结
  • 原文地址:https://www.cnblogs.com/huiyichanmian/p/12402136.html
Copyright © 2011-2022 走看看