在Python中,类的继承与函数的重写,是我们再熟悉不过的知识点。但如何实现,方法的强制重写与禁止重写,这大概是很多初学者的一个知识盲区吧?

01

强制重写

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

实现的方法大约有这两种:

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

2、指定方法抛出NotImplementedError异常

先来说说第一种

由于定义抽象基类,Py2和Py3有所区别,这里都举个例。

Python2.x中

# coding:utf-8

import abc

class Animal(object):

__metaclass__ = abc.ABCMeta

@abc.abstractmethod

def speak(self):

pass

class Dog(Animal):

def speak(self):

print("汪汪...")

class Cat(Animal):

pass

if __name__ == '__main__':

dog = Dog()

dog.speak()

cat = Cat()

cat.speak()

输出结果

汪汪...

Traceback (most recent call last):

File "F:/Python Script/hello.py", line 116, in

cat = Cat()

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

如果是Python3.x中,只需把 Animal 类改成如下即可

class Animal(metaclass=abc.ABCMeta):

@abc.abstractmethod

def speak(self):

pass

输出结果,报错。

Traceback (most recent call last):

汪汪...

File "F:/Python Script/hello.py", line 114, in

cat = Cat()

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

以上说明,只要把一个方法定义成抽象方法,那解释器就会要求子类,必须实现(重写)这个方法,否则就会报TypeError异常。

要注意的是,这个异常在实例化时,就会抛出,而不需要等到调用函数。

再来说说,第二种方法

我们给父类的speak方法,加上抛出异常语句。他会帮我们检测,这个方法在子类中有没有被重新实现,没有的话,就会抛出异常。

class Animal():

def speak(self):

raise NotImplemented

class Dog(Animal):

def speak(self):

print("汪汪...")

class Cat(Animal):

pass

if __name__ == '__main__':

dog = Dog()

dog.speak()

cat = Cat()

cat.speak()

运行后,报错,提示我们这个方法没有被重写。

汪汪...

Traceback (most recent call last):

File "F:/Python Script/hello.py", line 114, in

cat.speak()

File "F:/Python Script/hello.py", line 101, in speak

raise NotImplemented

TypeError: exceptions must derive from BaseException

要注意的是,这个异常只有在调用speak函数时,才会抛出。

02

禁止重写

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

来看下这个常规的例子。

class Base:

def go(self):

print("base")

def run(self):

self.go()

class Extend(Base):

def go(self):

print("extend")

person = Extend()

person.run()

输出结果,很正常,和我们的预期符合。

extend

先不要开心太早,来看看下面这个例子

class Base:

def __go(self):

print("base")

def run(self):

self.__go()

class Extend(Base):

def __go(self):

print("extend")

person = Extend()

person.run()

输出如下,你一定很纳闷,为什么会这样。

base

仔细观察一下,其实区别只有,一个是公开函数,一个私有函数。

于此,我们可以得出结论。

私有函数的作用范围仅在当前类,其表象上可以被重写,但实际上并无重写的效果。

python写一个类方法_Python基础|类方法的强制重写与禁止重写相关推荐

  1. 用python写一个函数_Python基础-函数篇

    1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 函数与函数式编程 1.面向对象: 华山派----> ...

  2. 用python写一个通讯录_python写一个通讯录

    闲着没事,用python写一个模拟通讯录,要求要实现常用的通讯录的功能,基本流程如下 ​ 接下来就按照这个流程实现各个模块的功能 1. 定义一个类,并初始化 def __init__(self): w ...

  3. python定义一个人类_python基础课程 第9章 面向对象编程(上) 一场人类进化史

    日月灿烂,若出其中,星汉灿烂,若出其里. -- 曹操.观沧海 东汉末年 人类文明以降,总会有无数的人通过对世界的观察和思考去总结我们从哪里来,要往哪里去. 遥远的古代我们的祖先通过想象力把数字变成了符 ...

  4. 使用python写一个倒计时_Python 实现一个计时器

    问题 你想记录程序执行多个任务所花费的时间 解决方案 time 模块包含很多函数来执行跟时间有关的函数. 尽管如此,通常我们会在此基础之上构造一个更高级的接口来模拟一个计时器.例如: import t ...

  5. python写一个计时器_Python 实现一个计时器

    问题 你想记录程序执行多个任务所花费的时间 解决方案 time 模块包含很多函数来执行跟时间有关的函数. 尽管如此,通常我们会在此基础之上构造一个更高级的接口来模拟一个计时器.例如: import t ...

  6. python 写一个计算器_Python | 写个计算器吧

    今天咱们用python来写一个计算器,计算一组数的最大公约数和最小公倍数吧. 注:本文使用python3 01 死循环 下面给出一段看似正确的代码,这段代码的作用是给出n1,n2的最小公倍数. 你可以 ...

  7. python写一个服务_Python写一个服务

    # coding:utf-8 import json from urllib.parse import parse_qs from wsgiref.simple_server import make_ ...

  8. python定义一个字符串_Python基础之字符串

    初识字符串 字符串的认识 首先,我们先认识下什么是字符串:# 定义字符串 t_str1 = "Hello World" t_str2 = "asdfghh" p ...

  9. python写sql语句_python基础---sql语句

    数据库系统: 数据库:文件夹 数据表:文件 表记录:一条数据 sql语句规范 sql是Structured Query Language(结构化查询语言)的缩写.SQL是专为数据库而建立的操作命令集, ...

  10. 如何用python写抽签组合_Python基础练习实例22(抽签问题)

    题目:两个乒乓球队进行比赛,各出三人.甲队为a,b,c三人,乙队为x,y,z三人.已抽签决定比赛名单.有人向队员打听比赛的名单.a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单. 思路: ...

最新文章

  1. 新手神器!不用部署深度学习环境、上传数据集!(附代码视频教程)
  2. 产品经理应该如何设计面包屑原理
  3. 【转】语义化版本 2.0.0
  4. java discard方法,Java ByteBuf.discardReadBytes方法代码示例
  5. ios图片轮播 (基础篇——UIScrollView实现方式)
  6. 台式计算机光标时不时跳动,解决方案:如何解决联想笔记本触摸板上的光标跳动?...
  7. java反射获取泛型_如何通过Java反射获取泛型类型信息
  8. 学生管理系统(JAVA后台简约版)
  9. 光立方,动手搭——原理简述
  10. 学累了可以看漫威电影啊
  11. Nucleus SE RTOS 中的中断
  12. html单标签的语法并举例,HTML简介及举例
  13. 用python的xlwings模块实现excel工作表批量隐藏和取消隐藏
  14. whx带我刷JOI training
  15. 程序员之路:Gmail邮箱客户端配置
  16. html中的abbr有什么作用,html中关于abbr标签的使用以及作用的详解
  17. MATLAB工作空间变量的保存方法总结,非常实用!
  18. 乐优商城:笔记(六):上传微服务:LyUpload
  19. 模拟信号的采样及采样定理
  20. 互联网成数据宝库,网络数据采集技术推动人工智能发展

热门文章

  1. 【多进程并行版本】爬取链家二手房前100页标签,进行统计
  2. DIP第十章习题解答
  3. linux sybase系统,linux sybase 安装全过程(写给初学者)
  4. javascript 数组和对象的浅复制和深度复制 assign/slice/concat/JSON.parse(JSON.stringify())...
  5. 《DSP using MATLAB》Problem 6.24
  6. SPSS单一样本的T检验
  7. 修改hostname
  8. Robot Framework Webdriver For Firefox FQA
  9. IE6环境下遭遇winow.location.href=''的跳转bug
  10. UA OPTI544 量子光学14 量子电动力学基础