python之面向对象详解(一)

一.类与对象

1.1类和对象的创建

  • 类提供了创建对象的蓝图。
  • 对象是类的实例,拥有类中定义的属性和方法。
  • self 参数是对类实例自身的引用,用于访问类的属性和方法。

案例:

下面举一个“长方形”类的例子,包含长,宽属性

#面向对象基础
class Changfangxing:  #类的首字母大写,这是规范def __init__(self,chang,kuan):  #类的初始化方法,self是实例本身,chang和kuan是变量名称(根据自己的需要定义,可要可不要).注意:在类中的函数叫做方法print('两边长相等')self.chang=changself.kuan=kuan#若后面的方法中有self,就可以用self.chang和self.kuan# (自身的长和宽可以被类中所有方法使用)# (self用来串联类方法的一个桥梁)def zhouchang(self):return (self.chang+self.kuan)*2def mianji(self):return self.chang*self.kuan
cfx=Changfangxing(5,3)  #实例化一个长方形
print(cfx.zhouchang())
print(cfx.mianji())
print(cfx.__dict__)  #实例的属性

练习:写一个三角形的类,有初始化方法,周长方法,面积方法

练习的答案,可在资源绑定中下载

1.2类方法和静态方法

类方法

  • 类方法是用 @classmethod 装饰器定义的。
  • 类方法的第一个参数是类本身,通常命名为 cls,通过它可以访问类的属性和其他类方法。
  • 类方法可以访问和修改类状态,通常用于定义那些不依赖于具体实例的方法。

案例:

class Rectangle: #新建一个长方形的类def __init__(self,length,width):  # self是实例本身,而cls是类本身self.length=lengthself.width=widthdef permeter(self):  #定义周长的方法return (self.length+self.width)*2def area(self):  #定义面积的方法return self.length*self.width@classmethod  #装饰器,表示下面的方法是类方法def features(cls):  # self是实例本身,而cls是类本身print('两边长相等,两边的宽也相等,长和宽的角度为90度')
# Rectangle.permeter(2,4)  #这样写会报错的。类不能直接调用实例方法,类必须要实例化才能调用方法(实例方法只能用实例调用)
rec=Rectangle(3,4) #创建一个实例对象
print(rec.permeter())  #实例方法只能用实例调用
print(rec.area())
Rectangle.features()  #类方法可以用类调用,也可以用实例调用

静态方法

  • 静态方法是用 @staticmethod 装饰器定义的。
  • 静态方法不接受类 (cls) 或实例 (self) 的隐式第一个参数,它就像是一个普通的函数,只是碰巧在类的定义中。
  • 静态方法不能访问类或实例的属性和其他方法,它主要用于放置在逻辑上属于类的功能,但不需要访问类或实例的任何数据。

案例:

class Rectangle: #新建一个长方形的类def __init__(self,length,width):  # self是实例本身,而cls是类本身self.length=lengthself.width=widthdef permeter(self):  #定义周长的方法return (self.length+self.width)*2def area(self):  #定义面积的方法return self.length*self.width# 类方法和静态方法的区别:# 类方法有一个类本身,但是静态方法没有@classmethod  #装饰器,表示下面的方法是类方法def features(cls):  # self是实例本身,而cls是类本身print('两边长相等,两边的宽也相等,长和宽的角度为90度')@staticmethod  # 静态方法,本质上是函数def sumdata(a,b):return  a+b
# Rectangle.permeter(2,4)  #这样写会报错的。类不能直接调用实例方法,类必须要实例化才能调用方法(实例方法只能用实例调用)
rec=Rectangle(3,4) #创建一个实例对象
print(rec.permeter())  #实例方法只能用实例调用
print(rec.area())
Rectangle.features()  #类方法可以用类调用,也可以用实例调用
rec.features()
print(rec.__dict__)  #查看实例属性
print(rec.sumdata(23,43))
print(Rectangle.sumdata(23,33))  #类和实例都可以调用静态方法

类和实例都可以调用静态方法 

# 类方法和静态方法的区别:
    # 类方法有一个类本身,但是静态方法没有

验证静态方法其实是一个函数,可以type

#type的方式验证静态方法是否是函数
print(type(rec.sumdata))  #运行结果:<class 'function'>。注意sumdata后不能跟小括号,因为这样判断的类型就是sumdata函数返回值的类型了,而不是sumdata本身
print(type(rec.permeter))  #运行结果:<class 'method'>method为方法,function为函数

二.继承

在 Python 中,继承允许我们定义一个类(子类)继承另一个类(父类)的属性和方法。子类会继承父类的所有公有属性和方法,并可以添加自己的属性和方法,或者重写继承的方法。

2.1完全继承

案例(继承上面例子中长方形的类) :

class Rectangle: #新建一个长方形的类def __init__(self,length,width):  # self是实例本身,而cls是类本身self.length=lengthself.width=widthdef permeter(self):  #定义周长的方法return (self.length+self.width)*2def area(self):  #定义面积的方法return self.length*self.width# 类方法和静态方法的区别:# 类方法有一个类本身,但是静态方法没有@classmethod  #装饰器,表示下面的方法是类方法def features(cls):  # self是实例本身,而cls是类本身print('两边长相等,两边的宽也相等,长和宽的角度为90度')@staticmethod  # 静态方法,本质上是函数def sumdata(a,b):return  a+b
# Rectangle.permeter(2,4)  #这样写会报错的。类不能直接调用实例方法,类必须要实例化才能调用方法(实例方法只能用实例调用)
rec=Rectangle(3,4)  #创建一个实例对象
print(rec.permeter())  #实例方法只能用实例调用
print(rec.area())
Rectangle.features()  #类方法可以用类调用,也可以用实例调用
rec.features()
print(rec.__dict__)  #查看实例属性
print(rec.sumdata(23,43))
print(Rectangle.sumdata(23,33))  #类和实例都可以调用静态方法#type的方式验证静态方法是否是函数
print(type(rec.sumdata))  #运行结果:<class 'function'>。注意sumdata后不能跟小括号,因为这样判断的类型就是sumdata函数返回值的类型了,而不是sumdata本身
print(type(rec.permeter))  #运行结果:<class 'method'>method为方法,function为函数#inspect模块
import inspect #python的自检模块,可以判断一个对象是否是某种类型
print(inspect.ismethod(rec.area)) #说明实例方法是方法,返回值是布尔类型
print(inspect.ismethod(rec.features)) #说明类方法是方法
print(inspect.isfunction(rec.sumdata)) #说明静态方法是函数#继承
#完全继承
class Square(Rectangle):pass
squ=Square(6,6)
print(squ.permeter())
print(squ.area())

2.2部分继承

重写了某方法

class Rectangle: #新建一个长方形的类def __init__(self,length,width):  # self是实例本身,而cls是类本身self.length=lengthself.width=widthdef permeter(self):  #定义周长的方法return (self.length+self.width)*2def area(self):  #定义面积的方法return self.length*self.width# 类方法和静态方法的区别:# 类方法有一个类本身,但是静态方法没有@classmethod  #装饰器,表示下面的方法是类方法def features(cls):  # self是实例本身,而cls是类本身print('两边长相等,两边的宽也相等,长和宽的角度为90度')@staticmethod  # 静态方法,本质上是函数def sumdata(a,b):return  a+b
# Rectangle.permeter(2,4)  #这样写会报错的。类不能直接调用实例方法,类必须要实例化才能调用方法(实例方法只能用实例调用)
rec=Rectangle(3,4)  #创建一个实例对象
print(rec.permeter())  #实例方法只能用实例调用
print(rec.area())
Rectangle.features()  #类方法可以用类调用,也可以用实例调用
rec.features()
print(rec.__dict__)  #查看实例属性
print(rec.sumdata(23,43))
print(Rectangle.sumdata(23,33))  #类和实例都可以调用静态方法#type的方式验证静态方法是否是函数
print(type(rec.sumdata))  #运行结果:<class 'function'>。注意sumdata后不能跟小括号,因为这样判断的类型就是sumdata函数返回值的类型了,而不是sumdata本身
print(type(rec.permeter))  #运行结果:<class 'method'>method为方法,function为函数#inspect模块
import inspect #python的自检模块,可以判断一个对象是否是某种类型
print(inspect.ismethod(rec.area)) #说明实例方法是方法,返回值是布尔类型
print(inspect.ismethod(rec.features)) #说明类方法是方法
print(inspect.isfunction(rec.sumdata)) #说明静态方法是函数#继承
#完全继承
class Square(Rectangle):pass
squ=Square(6,6)
print(squ.permeter())
print(squ.area())#部分继承
class Square(Rectangle):def __init__(self,side):self.length=sideself.width=side
squ=Square(6)
print(squ.permeter())
print(squ.area())

注:如果全部重写,其实相当于没有继承任何方法,没有任何的意义

2.3重载

重载就是重新写了该方法的内容,如果你想保留父类的该方法,可加上super()

#重载,有时对于某方法,想继承一部分,又不想彻底重写,只想增补一些内容
class Square(Rectangle):def __init__(self,side):self.length=sideself.width=side@classmethoddef features(cls):# Rectangle.features() #与下一行的作用是相同的,选一种使用即可super().features() #保留父类方法中的内容print('长和宽也相等')
squ=Square(6)
squ.features()

2.4多继承

class Youqian2:def money(self):print('有钱2个亿')
class Youqian1:def money(self):print('有钱1个亿')
class Human(Youqian1,Youqian2): #继承多个类时,中间用逗号隔开,书写的顺序决定继承的顺序pass
hum=Human()
hum.money()  #方法名相同时调用,会执行写到前面的那个类中定义的方法。所以该运行结果是:有钱1个亿

2.5扩充

所有的类都是object的子类,无论是否声明继承object,其实都继承了
class Class1:'''两岸猿声啼不住轻舟已过万重山'''
class Class2(object):pass
print(Class1.__doc__) #显示类的注释
print(Class1.__name__) #显示类的名称
print(Class1.__bases__) #显示父类的名称

三.封装

封装是面向对象编程(OOP)的基石之一,它涉及到将对象的数据(属性)和操作这些数据的代码(方法)捆绑在一起的概念。这不仅可以保护对象的状态免受外部干扰,还可以简化外部与对象的交云。

3.1数据隐藏

  • 私有属性和方法:通过在属性或方法名前添加双下划线(__)来定义私有属性和方法,这样它们就不能从类的外部被访问或修改,只能通过类的内部方法访问。

私有属性和方法案例

  • 私有属性,在属性的前面加__就是私有属性
  • 私有方法,在方法的前面加__就是私有方法
  • 私有属性和私有方法不能被外部直接访问,也不能被子类直接继承
class Cls1:__a=10  #私有属性def __init__(self):passdef __yinchang(self):print('这是一个私有方法')def aabbcc(self):print(self.__a)  #私有属性可以被类当中的方法访问self.__yinchang()  #私有方法可以被类当中的其他方法访问cls1=Cls1()
# print(cls1.__a)  #这样会报错
cls1.aabbcc()
# cls1.__yinchang()  #这样会报错class Cls2(Cls1):pass
cls2=Cls2()
# print(cls2.__a)  #这样会报错

 四.多态

多态是面向对象编程中的一个核心概念,它允许我们使用一个统一的接口来操作不同的数据类型。在 Python 中,多态意味着不同类的对象可以对同一个方法调用做出不同的响应。这通常是通过继承和方法重写实现的

案例一:

#多态 几个类当中有同名的方法,根据传的实例的不同,调用不同的方法
class Animal:def say(self):pass
class Dog(Animal): #定义一个狗的类def say(self):print('汪汪') #打印汪汪
class Cat(Animal): #定义一个猫的类def say(self):print('喵喵') #打印喵喵
def anmial_say(obj): #定义一个函数,根据传的实例调用各自的say()方法obj.say()
dog=Dog()
cat=Cat()
anmial_say(dog)
anmial_say(cat)

注意:anmial_say方法中的obj参数是要传类的实例对象

案例二:

class Fanguan:pass
class Yuxiangrousi(Fanguan):def caidan(self):print('鱼香肉丝')
class Gongbaojiding(Fanguan):def caidan(self):print('宫保鸡丁')
class Qingjiaotudousi(Fanguan):def caidan(self):print('青椒土豆丝')
def fuwuyuan(obj):obj.caidan()
guke1=Yuxiangrousi()
guke2=Gongbaojiding()
guke3=Qingjiaotudousi()
fuwuyuan(guke1)
fuwuyuan(guke2)
fuwuyuan(guke3)

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

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

相关文章

前端进阶-js查漏补缺

1、部分语法基础 1.1、let、const 特性&#xff1a;// 1、暂时行死区 // 比如有这一个例子 let aa "111" function test(){console.log(aa)let aa "22" } // 会报错引用错误&#xff0c;就是因为在函数test作用域内存在暂时性死区&#xff0c;如果把aa…

python pandas处理股票量化数据:笔记2

有一个同学用我的推荐链接注册了tushare社区帐号https://tushare.pro/register?reg671815&#xff0c;现在有了170分积分。目前使用数据的频率受限制。不过可以在调试期间通过python控制台获取数据&#xff0c;将数据保存在本地以后使用不用高频率访问tushare数据接口&#xf…

Scala的字符串插值

Scala的字符串插值 期待您的关注 ☀Scala学习笔记 目录 Scala的字符串插值 1. s插值器&#xff1a; 2. f插值器&#xff1a; 3. raw插值器&#xff1a; 在Scala中&#xff0c;字符串插值是一种方便的方式&#xff0c;可以在字符串中插入变量或表达式的值。Scala支持三种类型…

Mybatis用Map接收返回值可能出现的问题

先看一个示例 明明定义了Map<String,String> 实际内部存放的是Integer resultType是Map 也就是说Mybatis是通过反射将类型放进去的 躲过了编辑器检查 但是这样取值时候就会报类型转换错误 解决方式 resultMap 另外一种方式 用Number Integer和Double的父类 Ma…

大学生计算机基础题(二)

嗨&#xff0c;大家好&#xff0c;我是异星球的小怪同志 一个想法有点乱七八糟的小怪 如果觉得对你有帮助&#xff0c;请支持一波。 希望未来可以一起学习交流。 一、单选题&#xff08;20小题&#xff0c;共30分&#xff09; 1、已知a2,b3,print((ab)%b)的输出结果为&…

Excel/WPS《超级处理器》功能介绍与安装下载

超级处理器是基于Excel或WPS开发的一款插件&#xff0c;拥有近300个功能&#xff0c;非常简单高效的处理表格数据&#xff0c;安装即可使用。 点击此处&#xff1a;超i处理器安装下载 Excel菜单&#xff0c;显示如下图所示&#xff1a; WPS菜单显示&#xff0c;如下图所示&am…

15.混合专家模型(MoEs)技术揭秘

混合专家模型&#xff08;MoEs&#xff09;技术揭秘 混合专家模型&#xff08;Mixture-of-Experts, MoEs&#xff09;技术发展简史 Mixtral 8x7B &#xff1a;质效并举的稀疏混合专家模型 Mixtral 8x7B &#xff1a;质效并举的稀疏混合专家模型 MoEs 技术发展简史 MoEs 开山…

matplotlib twinx多y轴但单个图例

matplotlib 用 twinx 画多 y 轴参考 [1]。现想在画图例时&#xff0c;多个 y 轴的图例画在一起&#xff0c;写法参考 [2]。本文展示一个简例&#xff0c;效果&#xff1a; Code 要手动指定颜色&#xff0c;否则原 y 轴的用色和新 y 轴会重合。 import matplotlib.pyplot as…

永磁同步直线电机(PMLSM)控制与仿真2-永磁同步直线电机数学模型搭建

文章目录 1、公式总结2、电压方程模型3、运动方程4、推力方程5、转化关系 写在前面&#xff1a;原本为一篇文章写完了永磁同步直线电机数学模型介绍&#xff0c;永磁同步直线电机数学模型搭建&#xff0c;以及永磁同步直线电机三环参数整定及三环仿真模型搭建&#xff0c;但因为…

Dockerfile小技巧(通过变量指定程序配置文件内容)

思路&#xff1a;Dockerfile中定义变量&#xff0c;程序配置文件中使用占位符暂时代替变量内容&#xff0c;最后使用变量值替换占位符实现&#xff0c;这样就可以实现通过定义变量来定义程序启动时的一些参数了。 1、我以构建Nginx镜像为例&#xff0c;作为演示&#xff0c;Do…

TCP及UDP协议

tcp是点到点的&#xff0c;只有一条路径&#xff0c;到达顺序和发送顺序是相同的 回复的确认号是序发送端的序列号加上data的长度 1910 发送端的序列号也是那么算的 ack和下一个seq一样 那就没问题 三次握手四次挥手&#xff1a; 为啥是三次呢&#xff1f; 假如一次&#xf…

关于Linux ping 不通外网

网关为第三段为137那么子网ip第三段必须为137且IPaddr必须为137 将主机虚拟适配器连接到此网络必须勾上&#xff0c;不然vmnet适配器在windows将找不到 ping www.baidu.com不行的话试着勾上桥接模式应该是不行在勾上取消勾上桥接模式最后勾上nat模式

Spring框架的原理及应用详解(四)

本系列文章简介&#xff1a; 在当今的软件开发世界中&#xff0c;随着应用复杂性的不断增加和技术的快速发展&#xff0c;传统的编程方式已经难以满足快速迭代、高可扩展性和易于维护的需求。为此&#xff0c;开发者们一直在寻求更加高效、灵活且易于管理的开发框架&#xff0c…

【2024亲测无坑】在Centos.7虚拟机上安装Oracle 19C

目录 一、安装环境准备 1、linux虚拟机安装 2、虚拟机快照 3、空间检查&软件上传 二、Oracle软件安装 1.preinstall安装及其他配置准备 2.oracle安装 三、数据库实例的安装 1.netca——网络配置助手 2.dbca——数据库配置助手 四、ORACLE 19C 在linux centos 7上…

Linux rm命令由于要删的文件太多报-bash: /usr/bin/rm:参数列表过长,无法删除的解决办法

银河麒麟系统&#xff0c;在使用rm命令删除文件时报了如下错误&#xff0c;删不掉&#xff1a; 查了一下&#xff0c;原因就是要删除的文件太多了&#xff0c;例如我当前要删的文件共有这么多&#xff1a; 查到了解决办法&#xff0c;记录在此。需要使用xargs命令来解决参数列表…

Vue3 和 Vue2 对比分析及示例代码解析(初级)

Vue3 和 Vue2 的主要区别在于 Vue3 引入了 Composition API&#xff0c;这是一种新的组织和复用代码的方式。而 Vue2 主要依赖于 Options API。 先来看一个 Vue2 的示例&#xff1a; // Vue 2 export default {data() {return {count: 0}},methods: {increment() {this.count…

誉天教育近期开班计划(6月15日更新)

云计算HCIP 周末班 2024/6/15 田老师 售前IP-L3 周末班 2024/6/15 陈老师 RHCA442 晚班 2024/6/17邹老师 数通HCIE 晚班 2024/6/24阮老师 云计算HCIE直通车晚班 2024/6/25 曾老师 售前IT-L3 周末班 2024/6/29 伍老师 数通HCIP 晚班 2024/7/1杨老师 存储直通车 晚班 2024/7/1 高…

C# OpenCvSharp 逻辑运算-bitwise_and、bitwise_or、bitwise_not、bitwise_xor

bitwise_and 函数 🤝 作用或原理: 将两幅图像进行与运算,通过逻辑与运算可以单独提取图像中的某些感兴趣区域。如果有掩码参数,则只计算掩码覆盖的图像区域。 示例: 在实际应用中,可以用 bitwise_and 来提取图像中的某些部分。例如,我们可以从图像中提取出一个特定的颜…

【NoSQL数据库】Redis Cluster集群(含redis集群扩容脚本)

Redis Cluster集群 Redis ClusterRedis 分布式扩展之 Redis Cluster 方案功能数据如何进行存储 redis 集群架构集群伸缩向集群中添加一个新的master节点&#xff0c;并向其中存储 num10 .脚本对redis集群扩容缩容&#xff0c;脚本参数为redis集群&#xff0c;固定从6001移动200…

了解统计学中不同类型的分布

目录 一、说明 二、均匀分布&#xff1a; 三、机器学习和数据科学中的均匀分布示例&#xff1a; 3.1 对数正态分布&#xff1a; 3.2 机器学习和数据科学中的对数正态分布示例&#xff1a; 四、 帕累托分布 4.1 什么是幂律&#xff1f; 4.2 机器学习和数据科学中的帕累托分布示例…