Python面向对象编程之类的继承
作者:一碗周 发布时间:2021-10-27 23:46:39
1、对继承的理解
继承(Inheritance
) :代码复用的高级抽象
继承是面向对象设计的精髓之一
实现了以类为单位的高级抽象级别代码复用
继承是新定义类能够几乎完全使用原有类属性与方法的过程
不管是基类还是派生类,只是一种继承说法,这都是普通的Python
类
也可以按子类、父类和超类划分。
最基础的类是基类,经过一次继承得出派生类,还可以再一次继承,又得出一个派生类;现在最基础的类和第一次继承出来的派生类是父类与子类的关系,派生出来的类在最后一次派生出来的类也是父类与子类的关系,而最基本的类和最后一个派生类属于超类和子类的关系
派生类不仅可以继承一个基类,也可以继承多个基类,这就是所说的多继承的概念
2、类继承的构建
类继承的时候在定义的时候声明继承关系,语法结构如下
class <派生类名>(<基类名>): # 基类名可以带路径:ModuleNama.BaseClassName
def __init__(self, <参数列表>):
<语句块>
...
派生类可以直接使用基类的属性和方法
基类的属性基本等于定义在派生类中
派生类可以直接使用基类的类属性、实例属性
派生类可以直接使用基类的各种方法
使用基类的类方法和类属性时,要用基类的类名调用
实例代码:
class TestClass:
def __init__(self, number):
self.sum_number = 0
for i in range(number + 1):
self.sum_number += i
def sum_num(self):
return self.sum_number
class HumanNameClass(TestClass):
def double_sum(self):
return self.sum_number * 2 # 对基类属性的使用
value1 = HumanNameClass(100)
print(value1.sum_num()) # 5050 # 对基类实例方法的使用
print(value1.double_sum()) # 10100 # 对派生类实例方法的使用
Python
中有两个与继承关系判断有关的函数
接上面的代码,
print(isinstance(value1, TestClass)) # True
print(isinstance(value1, HumanNameClass)) # True
print(isinstance(value1, int)) # False
print(issubclass(HumanNameClass, TestClass)) # True
print(issubclass(TestClass, HumanNameClass)) # False
3、Python中最基础的类
因为Python
中万物皆对象,任何一个类也是对象、Python
的所有数据类型也对象;Python
语言提供所有类的最基础类是object
。
object
是Python
最基础类的名词,不需要翻译所有了定义时默认继承
object
保留属性和保留方法本质上是
object
类的属性和方法
示例代码:
print(object.__name__) # 打印object的名字 # object
print(object.__bases__) # 打印object所继承的类名称 # ()
print(object.__doc__) # 打印object类描述 # The most base type
print(object.__module__) # 打印object所在模块的名称 # builtins
print(object.__class__) # object所对应的类信息 # <class 'type'>
Python
对象的三个要素:
标识
identity
:对象一旦构建不会改变,用id()
获得,一般是内存地址类型
type
:对象的类型,用type()
获得值
value
:分为可变mutable
与不可变immutable
两种
两个和基础类有关的Python
内置功能
函数/关键字 | 描述 |
---|---|
id(x) | 返回x的标识。CPython 中 id() 函数用于获取对象的内存地址。 |
x is y | 判断x和y的标识是否相等,返回True或False,不判断值 |
4、ython类的重载
重载是派生类对基类属性或方法的在定义
属性重载:派生类定义并使用了与基类相同名称的属性
方法重载:派生类定义并使用了与基类相同名称的方法
4.1 属性重载
属性重载采用就近覆盖原则,重载无需特殊标记。方法步骤
优先使用派生类重定义的属性和方法
然后寻找基类的属性和方法
在寻找超类的属性和方法
实例代码:
class TestClass:
text = "这是基类的类属性"
def __init__(self, number):
self.sum_number = 0
for i in range(number + 1):
self.sum_number += i
def sum_num(self):
return self.sum_number
class HumanNameClass(TestClass):
text = "这是派生类的类属性" # 类属性重载
def __init__(self, number):
self.sum_number = 1000 # 实例属性重载
def double_sum(self):
return self.sum_number * 2
value1 = HumanNameClass(100)
print(TestClass.text) # 这是基类的类属性
print(value1.text) # 这是派生类的类属性
print(value1.sum_num()) # 1000
4.2 方法重载
方法重载是派生类对基类方法的在定义;分为完全重载和增量重载
完全重载:派生类完全重定义与基类相同名称的方法
直接在派生类中定义同名方法即可
示例代码:
class TestClass:
def __init__(self, number):
self.sum_number = 0
for i in range(number + 1):
self.sum_number += i
def sum_num(self):
return self.sum_number
class HumanNameClass(TestClass):
def sum_num(self): # 方法的重建
return self.sum_number * 2
value1 = HumanNameClass(100)
print(value1.sum_num()) # 10100
增量重载:派生类扩展定义与基类相同名称的方法,语法结构
class <派生类名>(<基类名>):
def <方法名>(self, <参数列表>):
super().<基类方法名>(<参数列表>)
...
增量重载使用super()
函数
示例代码:
class TestClass:
def test_text(self):
print("这是基类的方法")
class TestClass1(TestClass):
def test_text(self): # 增量重载
super().test_text()
print("这是新增的方法里面的语句")
doc1 = TestClass()
doc2 = TestClass1()
print(doc1.test_text())
print(doc2.test_text())
'''
---输出结果---
这是基类的方法
None # 因为函数没有返回值
这是基类的方法
这是新增的方法里面的语句
None # 因为函数没有返回值
'''
5、类的多继承
多继承的构建是在定义时声明继承关系,语法结构
class <类名>(<基类名1>, <基类名2>,..., <基类名N>): # 基类名可以带路径:ModuleNama.BaseClassName
def __init__(self, <参数列表>):
<语句块>
...
Python
中多继承采用深度优先, 从左至右的方法。所谓深度优先从左至右就是先从最左边开始找,找到他的基类,如果基类没有在往上面找,直到最基础的object
类时还没有找到,才往右开始寻找。
所有属性和方法的使用按照“深度优先从左至右”的方式选取
构造函数也参照上述原则,super()
也参照上述原则
多个基类的顺序是关键
示例代码:
class Test1:
def test(self):
text = "这是基类1"
return text
class Test2:
def test(self):
text = "这是基类2"
return text
class Test3(Test1, Test2):
pass
class Test4(Test2, Test1):
pass
value1 = Test3()
value2 = Test4()
print(value1.test()) # 这是基类1
print(value2.test()) # 这是基类2
循序决定输出的结果
对继承概念的理解,类继承的构建,了解了object
是Python
中最基础的类
类属性的重载原则是最近覆盖原则
类方法的重载:重新重载的话类似类属性的重载;增量重载使用super()
函数
多继承采用的方法是深度优先,从左至右
来源:https://juejin.cn/post/7023552816228761608
猜你喜欢
- AJAX 客户端页面代码: index.html <html> <body> <h1>Ajax file
- 我们打开Google的时候可能大家会发现,无论你输入Google的任何网址,它都根据你使用的语言自动判断并跳转到不同的语言界面。也就是你用不
- pynput这个库让你可以控制和监控输入设备。对于每一种输入设备,它包含一个子包来控制和监控该种输入设备:pynput.mouse:包含控制
- 一、原因:今天在尝试初始化一个WEB应用的时候,发现其连接不上MySQL,从Traceback看到使用的默认密码为‘YES’。没辙,居然尝试
- 一:分组函数的语句顺序 1 SELECT ... 2 FROM ...
- 1. 生命周期(重要)1.1 初步认识生命周期别名:生命周期回调函数、生命周期函数、生命周期钩子。生命周期是什么?Vue在关键时刻帮我们调用
- 本文实例为大家分享了python给心爱的人每天发天气预报的具体代码,供大家参考,具体内容如下下面的代码实现了用了之前获取天气的代码,然后用i
- 错误出现:导入数据时出现“SqlDateTime 溢出。必须介于 1/1/1753 12:00:00 AM 和 12/31/9999 11:
- Static files管理static files指一些用到的像css,javascript,images之类的文件。在开发阶段:1.在s
- 大家都知道当任务过多,任务量过大时如果想提高效率的一个最简单的方法就是用多线程去处理,比如爬取上万个网页中的特定数据,以及将爬取数据和清洗数
- python 字符串替换 是python 操作字符串的时候经常会碰到的问题,这里简单介绍下字符串替换方法。python 字符串替换可以用2种
- 首先声明,在这组里我是个绝对的菜鸟。再次声明,小爝这个菜鸟在“网页设计”这个圈里混了快1年了。 摘要:我知道我有多少底,所以我在总结我的成长
- bytes 和 bytearraybytes 和 bytearray 都是二进制世界的成员,用二进制的方式去理解才能看清他的本质。理解byt
- c语言里:c_p.c#include <stdio.h>void get_str_list(int n, char *b[2])
- 一、问题描述通过调用MyQR模块来实现生成个人所需二维码。安装:pip install myqr二、代码实现1.普通二维码from MyQR
- 在使用 SQL Server 的过程中,用户遇到的最多的问题莫过于连接失败了。一般而言,有以下两种连接 SQL Server 的方式,一是利
- 写在前面在写go的时候经常用到序列化、反序列化,记录一下遇到过的坑。空指针会被解析成字符串"null"type Pers
- 今天下午,低一度博客受到攻击了,出现了大约一个小时的访问异常。庆幸的是,这帮无耻歹徒没能成功获取我的Access数据库,而只是象征性地给我注
- 前言今天我们简单说下Python函数和控制语句,大纲如下:函数“脏活累活交给函数来做”,首先,看看P
- 在缺失值填补上如果用前后的均值填补中间的均值,比如,0,空,1,我们希望中间填充0.5;或者0,空,空,1,我们希望中间填充0.33,0.6