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/diannao/27453.shtml

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

相关文章

关于对pagination.js源代码进行修改且引入项目使用

实现效果 使用定时器对组件进行每秒请求&#xff0c;每过固定时间之后&#xff0c;进行下一页项目请求&#xff0c;进行到最后一页请求的时候返回第一页。 首先引入js插件 <script src"./js/pagination.js" type"text/javascript"></script>…

Python 中国象棋游戏【含Python源码 MX_011期】

简介&#xff1a; 中国象棋是一种古老而深受喜爱的策略棋类游戏&#xff0c;也被称为中国的国粹之一。它在中国有着悠久的历史&#xff0c;起源可以追溯到几个世纪以前。Python 中国象棋游戏是一个用Python编程语言编写的软件程序&#xff0c;旨在模拟和提供中国象棋的游戏体验…

CVE-2024-23692:Rejetto HFS 2.x 远程代码执行漏洞[附POC]

文章目录 CVE-2024-23692&#xff1a;Rejetto HFS 2.x 远程代码执行漏洞[附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 CVE-2024-23692&#xff1a;Rejetto HFS 2.x 远程代码执行漏洞[附POC] 0x01 前言 …

Elasticsearch:简化数据流的数据生命周期管理

作者&#xff1a;来自 Elastic Andrei Dan 今天&#xff0c;我们将探索 Elasticsearch 针对数据流的新数据管理系统&#xff1a;数据流生命周期&#xff0c;从版本 8.14 开始提供。凭借其简单而强大的执行模型&#xff0c;数据流生命周期可让n 你专注于数据生命周期的业务相关方…

干货!电脑如何录屏?6款win10录屏大师软件深度测评

电脑如何录屏&#xff1f;在2024年&#xff0c;截图或屏幕录制可以说是一种无价的工具。它是捕捉重要信息、与朋友和同事分享说明&#xff0c;或者只是存储您最喜爱的游戏和应用程序中的记忆的好方法。在 Windows 上录制屏幕非常简单。在本篇文章中&#xff0c;我们将讨论在win…

113.网络游戏逆向分析与漏洞攻防-邮件系统数据分析-结构体数据更新思路分析

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果&#xff0c;代码看不懂是正常的&#xff0c;只要会抄就行&#xff0c;抄着抄着就能懂了 内容…

绘唐科技官网

绘唐科技AI工具是一系列经过训练的人工智能工具&#xff0c;旨在提供各种智能化的解决方案。这些工具可以应用于多个领域&#xff0c;包括自然语言处理、图像识别、语音识别、机器学习等。 其中&#xff0c;自然语言处理工具可以帮助用户处理和理解文本数据。它可以实现文本分类…

Spring 内置BeanFactoryPostProcessor的子孙们

同样的Spring 也 内置了 一些实现 BeanFactoryPostProcessor的类&#xff0c;各有各的用处。 spring-context AspectJWeavingEnabler 用来把ClassPreProcessorAgentAdapter注册到LoadTimeWeaver中ConfigurationClassPostProcessor 一个重要的类&#xff0c;用来处理Configurat…

3、matlab单目相机标定原理、流程及实验

1、单目相机标定流程及步骤 单目相机标定是通过确定相机的内部和外部参数&#xff0c;以便准确地在图像空间和物体空间之间建立映射关系。下面是单目相机标定的流程及步骤&#xff1a; 搜集标定图像&#xff1a;使用不同角度、距离和姿态拍摄一组标定图像&#xff0c;并确保标…

树莓派 sudo apt-get install python-smbus 报错

sudo apt-get install python-smbus 报错 sudo apt-get install python-smbus 报错 python-smbus : Depends: python (< 2.8)Depends: python (> 2.7~)Depends: python:any (< 2.8)Depends: python:any (> 2.7~) E: Unable to correct problems, you have held b…

泉州职业技术大学2024Java期末题库【基础题】

1.根据输入的表示星期几的数字&#xff0c;对应输出它的英文名称。 考察内容:Switch语句的掌握 public class test1 {public static void main(String[] args) {//switch语句复习//创建对象java.util.Scanner input new java.util.Scanner(System.in);//提示输入语句System.ou…

TF-IDF算法详细解析与应用

一、前言 在信息的海洋中&#xff0c;如何快速准确地找到我们需要的知识&#xff1f;搜索引擎给出了答案。而在搜索引擎背后&#xff0c;有一个核心算法无声地发挥着巨大作用——TF-IDF。本篇博客将为你揭开TF-IDF的神秘面纱&#xff0c;让你深入理解它的原理&#xff0c;并掌…

【递归、搜索与回溯】DFS解决FloodFill算法

一、经验总结 之前我们已经研究过了BFS解决FloodFill算法&#xff1a;【优选算法】BFS解决FloodFill算法-CSDN博客 DFS只是遍历顺序发生了变化&#xff0c;其他需要注意的点大差不差。 二、相关编程题 2.1 图像渲染 题目链接 733. 图像渲染 - 力扣&#xff08;LeetCode&am…

linux服务器网络配置

目录 1、centos的网络配置1.1 静态Ipv4配置方法&#xff1a;1.2 动态Ipv4的设置方法1.3 常见ping不通网关的原因&#xff1a;1.4 查看操作系统版本1.5 查看一台服务器的所有服务1.6 猜测所在房间网关ip 2、 Ubuntu的网络配置&#xff08;静态ipv4&#xff09;3、2024.6.14 解决…

计算机网络(8) Finite State Machines(有限状态机)

一.建立连接&#xff08;三次握手&#xff09; 建立连接过程中的状态转换如下&#xff1a; 客户端&#xff1a; 发送SYN CLOSED >>>>>>>>>>>>>>SYN SENT(第一次握手) 接收SYNACK发送ACK …

【云原生】创建harbor私有仓库及使用aliyun个人仓库

1.安装docker #删除已有dockersystemctl stop docker yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine #安装docker yum install -y docker-ce-20.10.1…

SIGMOD 2024 | 时空数据(Spatial-Temporal)和时间序列(Time Series)论文总结

SIGMOD2024于6月9号-6月14号正在智利圣地亚戈举行&#xff08;Santiago Chile&#xff09; 本文总结了SIGMOD 2024有关时间序列&#xff08;time series&#xff09;,包括时序数据库&#xff0c;查询优化等内容。以及时空数据&#xff08;spatial-temporal data&#xff09;的…

简单http客户端程序

要求和目的 深入理解http协议以及http下载相关功能的程序设计 实验环境 Java语言&#xff0c;PC平台 实验要求 基本要求&#xff1a;使用Socket类&#xff0c;实现一个简单的HTTP客户端程序。用户输入URL&#xff0c;该程序可以从服务器下载URL指定的资源&#xff0c;并将之…

【gtest】 C++ 的测试框架之使用 gtest 编写单元测试

目录 &#x1f30a;前言 &#x1f30a;使用 cmake 启动并运行 gtest &#x1f30d;1. 设置项目 &#x1f30d;2. 创建并运行二进制文件 &#x1f30a;1. gtest 入门 &#x1f30d;1.1 断言&#xff08;assertions&#xff09; &#x1f30d;1.2 简单测试 &#x1f30d;…

167. 两数之和 II - 输入有序数组(中等)

167. 两数之和 II - 输入有序数组 1. 题目描述2.详细题解3.代码实现3.1 Python3.2 Java 1. 题目描述 题目中转&#xff1a;167. 两数之和 II - 输入有序数组 2.详细题解 作为双指针方法的第一弹&#xff0c;先简要介绍下该方法&#xff1a; 若两个指针指向同一数组&#xf…