码迷,mamicode.com
首页 > 编程语言 > 详细

Python知识补充

时间:2020-03-03 15:08:30      阅读:77      评论:0      收藏:0      [点我收藏+]

标签:elf   xtend   image   otl   abs   效果   not   src   err   

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

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

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

 

Python知识补充

标签:elf   xtend   image   otl   abs   效果   not   src   err   

原文地址:https://www.cnblogs.com/huiyichanmian/p/12402136.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!