python面向对象三大特性

封装

python的封装是将事物的特征和行为,封装成对应的属性和方法

魔法方法

魔法方法是指不需要主动调用,在某种特定情况下自动调用的方法。

魔法方法的定义方式:__方法名__()

初始化方法

python中类的初始化方法为__init__()

是一个魔法方法,当对象创建时自动调用

class A:def __init__(self):print("调用A类的初始化方法")a = A()# 执行结果
调用A类的初始化方法

初始化方法可以带参数,用于给实例属性赋值,如下:

class A:def __init__(self, a, b, c):self.a = aself.b = bself.c = cprint(f"a = {self.a}, b = {self.b}, c = {self.c}")a = A(10, 20, 30)# 执行结果
a = 10, b = 20, c = 30

self的含义和用法

self是在类中调用属性和方法的关键字,它代表当前调用属性和方法的对象,比如a对象调用实例方法x,此时方法x里面所使用的self就表示a对象

实例属性和实例方法

实例属性就是定义在__init__()里面的属性,通过self.定义和调用

实例方法就是定义在类里面的方法,第一个参数为self。

实例属性和实例方法,可以在类内和类外调用,类内通过self.调用,类外通过对象名调用

class A:def __init__(self, a, b, c):self.a = aself.b = bself.c = cprint("类内调用实例方法")self.func1()  # 类内调用实例方法print(f"a = {self.a}, b = {self.b}, c = {self.c}")def func1(self):print(f'调用了func1()实例方法')# 类内调用实例属性return self.a + self.ba = A(10, 20, 30)
print(a.a)  # 类外调用实例属性
print(a.b)
print(a.c)
c = a.func1()  # 类外调用实例方法
print(c)# 执行结果
类内调用实例方法
调用了func1()实例方法
a = 10, b = 20, c = 30
10
20
30
调用了func1()实例方法
30

类属性和类方法

类属性

类属性就是定义在类中但不定义在__init__()方法中的属性

在类内通过self.或类名调用,在类外可以通过对象名或类名调用

class A:x = 100y = 200def __init__(self, a, b, c):self.a = aself.b = bself.c = cprint(f'类内调用类属性:x = {self.x}, y = {self.y}')a = A(10, 20, 30)
print('类外调用类属性')
print(f'通过对象名调用:x = {a.x}')
print(f'通过类名调用:x = {A.x}')# 执行结果
类内调用类属性:x = 100, y = 200
类外调用类属性
通过对象名调用:x = 100
通过类名调用:x = 100

类方法

类方法是被 @classmethod装饰器 修饰的方法

类方法的第一个参数是cls,代表类本身

cls可以调用类属性和类方法

class A:x = 100y = 200@classmethoddef class_method(cls):cls.x = 88888cls.y = 99999print(f'x = {cls.x}, y = {cls.y}')a1 = A()
print(a1.x)
a1.class_method()
print(f'a1调用属性x和y:x = {a1.x}, y = {a1.y}')
a2 = A()
print(f'a2调用属性x和y:x = {a2.x}, y = {a2.y}')# 执行结果
100
x = 88888, y = 99999
a1调用属性x和y:x = 88888, y = 99999
a2调用属性x和y:x = 88888, y = 99999

静态方法

静态方法是被 @staticmethod装饰器修饰的方法

他没有固定参数

所以它调用不了类里面的属性和方法

类内可以通过self.或类名的方式调用静态方法

类外可以通过对象名或类名的方式调用静态方法

class A:x = 100y = 200def func1(self):# 类内调用静态方法self.static_method()@staticmethoddef static_method():print('调用了静态方法')a1 = A()
print('类内调用静态方法:')
a1.func1()
print('类外通过对象名调用静态方法:')
a1.static_method()
print('类外通过类名调用静态方法:')
A.static_method()# 执行结果
类内调用静态方法:
调用了静态方法
类外通过对象名调用静态方法:
调用了静态方法
类外通过类名调用静态方法:
调用了静态方法

继承

继承可以增加代码的复用性

python中有单继承和多继承,其中多继承的继承顺序是从左到右,在调用不同父类中相同的方法时,会优先调用自身的方法,然后才是父类,父类调用的优先级和继承顺序相同,都是从左到右。

super()

子类可以通过super()调用父类的属性和方法,包括__init__()魔法方法

调用父类的__init__()要注意:如果父类的__init__()方法有形参,则调用时也要传参

class A:def __init__(self):self.a = 'aaaaa'def func1(self):print('调用 A类 的func1方法')class B:def __init__(self):self.b = 'bbbbb'def func1(self):print('调用 B类 的func1方法')class C(A, B):def __init__(self):# 调用多个父类的__init__()方法可以使用下面这种方式super().__init__()super(A, self).__init__()self.c = 'ccccc'def func1(self):print('调用 C类 的func1方法')c = C()
# 打印该类的优先级
print(C.__mro__)
print(c.a)
print(c.b)
print(c.c)
c.func1()# 执行结果
(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
aaaaa
bbbbb
ccccc
调用 C类 的func1方法

多态

多态的含义:同一个引用,因为它指向的对象不同,所以表现出来的状态也不同

isinstance()

该方法第一个参数为对象、第二个参数为类名

可以判断该对象是否属于该类或者该类的子类,如果是返回True,不是返回False

可以通过它验证对象的合法性

class A:def __init__(self):self.name = 'aaaaa'class B(A):def __init__(self):super().__init__()self.name = 'bbbbb'class C(A):def __init__(self):super().__init__()self.name = 'ccccc'# 此处的a变量,因为每次传入的对象是不一样的,所以调用它所产生的结果是不一样的
def printName(a: A):print(a.name)a1 = A()
printName(a1)
b1 = B()
printName(b1)
c1 = C()
printName(c1)
# 可以通过isinstance判断对象是否属于该类或属于该类的子类,返回结果为bool类型
print(isinstance(a1, A))
print(isinstance(b1, A))
print(isinstance(c1, A))# 执行结果
aaaaa
bbbbb
ccccc
True
True
True

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/656813.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot请求406、500问题

请求406 2024-01-29 09:19:00 [http-nio-18811-exec-1] WARN org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver - Resolved [org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation]解决 在…

代码随想录算法训练营第二十天|654.最大二叉树、617.合并二叉树、700.二叉树搜索树中的搜索、98.验证二叉搜索树

文档讲解&#xff1a; 递归&#xff0c;层序遍历&#xff0c;BFS&#xff0c;DFS 654.最大二叉树 思路&#xff1a;这道题的思路跟之前利用前序遍历和中序遍历的数组来构造二叉树是一样的&#xff0c;抓住的关键点就是每个树的根节点&#xff0c;如何分割出来左子树和右子树&am…

Pi 5缺货?CM5什么出来?RP2024? 在 CES2024 上访谈树莓派CEO Eben Upton

Pi 5缺货&#xff1f;CM5什么出来&#xff1f;RP2024&#xff1f; 在 CES2024 上访谈树莓派CEO Eben Upton 树莓派 CEO Eben Upton 在 CES2024 上回答关于树莓派5缺货&#xff0c;Pi 5与AI&#xff0c;以及 CM5 和 RP2024 的未来发展这些相关问题。 00:00 - 树莓派上的AI &…

设计模式之框架源码剖析(实战+图解)

Java设计模式 1&#xff0c;概述 随着软件开发人员人数的增多&#xff0c;一些公司急需一些高端人才。作为一个高端人才&#xff0c;设计面向对象软件是必不可少的能力&#xff0c;而软件设计是需要很深的功力&#xff0c;设计模式就要求你必须掌握。 2&#xff0c;本章特色…

IO

IO&#xff08;Input/Output&#xff09;机制是指计算机与外界进行数据交换的过程。在计算机操作中&#xff0c;输入和输出是不可避免的两个环节。输入可以理解为从外部设备&#xff08;如键盘、鼠标等&#xff09;读取数据&#xff0c;输出则是将数据发送到外部设备&#xff0…

Linux(CentOS7)常见指令的常见用法(上)

指令功能hostname查看当前的主机名hostnamectl set-hostname修改主机名adduser添加用户passwd给用户设置密码userdel -r 删除用户ls显示某路径下的文件名ls -l ll 显示某路径下每个文件及其属性ls -la ls -al 显示某路径下所有文件包括隐藏文件及属性ls -d只看指定文件夹&…

《Linux C编程实战》笔记:信号应用于事件通知

实际应用中&#xff0c;进程可能需要等待某一事件的发生&#xff0c;一般可以通过检测某一全局变量来判断事件是否发生。有三种方法可以实现这一要求。 第一种&#xff1a;程序不停循环检测全局变量&#xff0c;这样可以满足要求&#xff0c;但是非常占用cpu资源 #include<…

5-1 A. DS串应用--KMP算法

题目描述 学习KMP算法&#xff0c;给出主串和模式串&#xff0c;求模式串在主串的位置 算法框架如下&#xff0c;仅供参考 输入 第一个输入t&#xff0c;表示有t个实例 第二行输入第1个实例的主串&#xff0c;第三行输入第1个实例的模式串 以此类推 输入样例&#xff1a; 3 qwe…

dfs专题 P1706 全排列问题——洛谷(题解)

题目描述 按照字典序输出自然数 11 到 &#xfffd;n 所有不重复的排列&#xff0c;即 &#xfffd;n 的全排列&#xff0c;要求所产生的任一数字序列中不允许出现重复的数字。 输入格式 一个整数 &#xfffd;n。 输出格式 由 1∼&#xfffd;1∼n 组成的所有不重复的数字…

Mac下手动源码编译安装Swig

使用Homebrew安装 这个方式最简单&#xff0c;但是一般都是安装的最新版&#xff1a; brew install swig如果按照特定版本&#xff0c;需要看一个当前支持的列表&#xff1a; brew search swig brew install swig3源码编译安装 swig依赖pcre库&#xff0c;需要先安装pcre …

浅谈一下软件 QA 方法论 和 工具

浅谈一下软件 QA 方法论 和 工具 目录概述需求&#xff1a; 设计思路实现思路分析1.QA方法论2.Java QA工具 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result…

Oracle Extractor 软件下载

oracle Extractor 研发背景 在企业日益增长的 IT 系统中&#xff0c;数据容量正以几何级数扩展。 oracle DBA 在保证数据完整 性的课题上正面临着现有磁盘存储系统容量不足以存放全量备份&#xff0c;基于磁带的数据备份在恢 复数据时往往要求远远超过预期的平均修复时间等实际…

Linux系统——文本三剑客

目录 一、grep 1.格式 2.选项 2.1 grep重定向 2.2grep -m 匹配到几次停止 2.3grep -i 忽略大小写 2.4grep -n 显示行号 2.5grep -c 统计匹配行数 2.6grep -A 后几行 2.7grep -C 前后三行 2.8grep -B 前三行 2.9grep -e 或 2.10grep -w 匹配整个单词 2.11grep -r…

窥探向量乘矩阵的存内计算原理—基于向量乘矩阵的存内计算

在当今计算领域中&#xff0c;存内计算技术凭借其出色的向量乘矩阵操作效能引起了广泛关注。本文将深入研究基于向量乘矩阵的存内计算原理&#xff0c;并探讨几个引人注目的代表性工作&#xff0c;如DPE、ISAAC、PRIME等&#xff0c;它们在神经网络和图计算应用中表现出色&…

现代C++之万能引用、完美转发、引用折叠FrancisFrancis

转载&#xff1a;现代C之万能引用、完美转发、引用折叠 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/99524127 后期参考(还未整合)&#xff1a;C 完美转发深度解析:从入门到精通_c完美转发-CSDN博客https://blog.csdn.net/qq_21438461/article/details/129938466 0.导语 …

Dragons

题目链接&#xff1a; Problem - 230A - Codeforces 解题思路&#xff1a; 用结构体排序就好&#xff0c;从最小的开始比较&#xff0c;大于就加上奖励&#xff0c;小于输出NO 下面是c代码&#xff1a; #include<iostream> #include<algorithm> using namespac…

Java发送post请求

Java发送post请求 1.省份字典2.姓氏字典3.结婚时祝愿字典4.发送Post请求5.整合一起 1.省份字典 List<String> provinces new ArrayList<>();provinces.add("北京");provinces.add("天津");provinces.add("河北");provinces.add(&qu…

Python程序设计 流程控制

1. if判断语句 if 语句是最简单的选择结构。如果满足条件就执行设定好的操作&#xff0c;不满足条件就执行其他其他操作。 1.1 判断的定义 如果 条件满足&#xff0c;才能做某件事情&#xff0c; 如果 条件不满足&#xff0c;就做另外一件事情&#xff0c;或者什么也不做 …

java框架面试篇

Spring框架 spring Bean线程安全问题 Scope注解 我们可以在bean的类上加Scope注解来声明这个Bean是单个实例还是多个实例。在默认情况下Bean是单个实例的&#xff0c;此时的注解中的属性默认为Scope("singleton")&#xff0c;Scope("prototype")则是一…

dfs专题(记忆化搜索)P1141 01迷宫——洛谷(题解)

题目描述 有一个仅由数字 00 与 11 组成的 &#xfffd;&#xfffd;nn 格迷宫。若你位于一格 00 上&#xff0c;那么你可以移动到相邻 44 格中的某一格 11 上&#xff0c;同样若你位于一格 11 上&#xff0c;那么你可以移动到相邻 44 格中的某一格 00 上。 你的任务是&#…