当前位置: 首页 > news >正文

Python的面向对象day7

1、什么是面向对象

面向对象称为OO,他通过将数据和功能封装在一个被称为‘对象’的实体中,来组织和管理代码。面向对象变成(OOP)具有四个特性,封装、继承、多态、抽象

优点:模块化、安全性高、代码重用性高

缺点:学习难度大、性能开销大、调试困难

2、类和对象

Python中的一切都是对象,类也是一个对象,Python 的内置类型也都是对象--内置对象,对象的抽象是类,类可以实例化若干个对象

2.1类的定义

语法格式1:
class ClassA:# 公共的属性def __init__(self):passdef fun1(self):passdef fun2(self):pass语法格式2:
class ClassA(object):# 公共的属性def __init__(self):passdef fun1(self):passdef fun2(self):pass实例化对象的语法:1》无参对象名 = 类名()2》有参对象名 = 类名(参数列表)   

2.2类的属性

Python中类的属性分为两种,类属性和实例属性

2.2.1类属性

定义在类级别上的变量,与类本身相关联,不与任何特定实例相关联,所有实例共享同一个类属性的值,除非在某个实例改变他的值

2.2.2实例属性

实例属性是与类的特定实例相关联的变量。每个实例都有自己独立的实例属性,即使这些实例属于同一个类。实例属性通常在实例的构造方法(__init__)中定义,使用self关键字来引用当前实例。

class stu():grade = 'py24101'def __init__(self, name, age):self.name = nameself.age=agedef study(self):print(f'{self.name}爱学习')def play(self):print(f'{self.name}玩游戏')
s1=stu('张三',18)
print(stu.grade)
print(s1.grade,s1.name)

注意事项

  • 类属性通常用于存储那些对类所有实例都相同的值。如果需要在实例之间共享数据,并且这些数据在实例的生命周期内不会改变,那么类属性可能是一个好的选择。

  • 实例属性用于存储与特定实例相关的数据。它们使得每个实例都可以有自己的状态和行为。

  • 当通过实例访问属性时,Python会首先查找实例属性。如果实例属性不存在,它会查找类属性。这意味着如果类属性和实例属性同名,实例属性会“隐藏”类属性。

  • 尽量避免在实例方法中修改类属性,因为这可能会导致意外的行为,特别是当你有多个实例时。如果确实需要修改类属性的值,请确保你了解这样做的后果。

2.3对象和类的关系

  1. 对象拥有类的所有属性和方法

  2. 对象的属性和方法可以单独添加、删除、修改

  3. 对象与对象之间的属性和方法不可共享

  4. 对象不能独自创建,必须依托于类,类可以实例化N个对象

class Stu(object):id = '1001'name = '张三'def fun1(self):pass# 实例化对象
s1 = Stu()
s2 = Stu()
# 对象的属性可以单独修改、添加、删除
s1.name = '李四'
s1.age = 18
del s1.age
print(s1.name)
# print(s1.age)
print(s2.name)
# print(s2.age)

还可以使用以下函数的方式来访问属性

  • getattr(obj, name[, default]) : 访问对象的属性。

  • hasattr(obj,name) : 检查是否存在一个属性。

  • setattr(obj,name,value) : 设置一个属性。如果属性不存在,会创建一个新属性。

  • delattr(obj, name) : 删除属性。

2.4魔方方法---构造函数与析构函数

  1. __init__ 构造函数:完成对象的初始化工作,方便统一管理、调用类创建对象时,自动执行。

  2. __del__ 析构函数:删除对象时执行一些操作,自动执行。

  3. __str__ 打印方法:输出执行信息,自动执行。

class car():def __init__(self,name,color):self.name=nameself.color=colordef __str__(self):return f"logo{self.name},color{self.color}"def __del__(self):print( f"{self.name}boom,go home")c1=car('保时捷','red')
c2=car('xiaomisu7','white')
print(c1.name,c2.name)
print(c1)
print(c2)

2.5类方法、实例方法、静态方法

class Student(object):"""定义了一个学生类"""grade = 'py24101'@classmethod#类方法def cls_fun(cls):"""类方法中只能调用类属性和类方法"""print(f"班级名称是{cls.grade}")def __init__(self, name, age):self.name = nameself.age = agedef fun1(self):"""实例方法中能调用类属性、实例属性"""print(f"实例方法中输出类属性{self.grade}, 输出实例属性{self.name}")@staticmethod#静态方法def sta_fun(x):print(f"{x}静态方法一般实现与类和对象无关联的操作,例如:游戏说明书等")s1 = Student('张三', 18)
# 如何调用类方法
Student.cls_fun()
s1.cls_fun()# 如何调用实例方法
Student.fun1(s1)
s1.fun1()# 如何调用静态方法
Student.sta_fun(3)
s1.sta_fun(3)

2.6Python的内置属性

  • __dict__ : 类的属性(包含一个字典,由类的数据属性组成)

  • __doc__ :类的文档字符串

  • __name__: 类名

  • __module__: 类定义所在的模块(类的全名是'__main__.className',如果类位于一个导入模块mymod中,那么className.__module__ 等于 mymod)

  • __bases__ : 类的所有父类构成元素(包含了一个由所有父类组成的元组)

3、封装

封装是类的三大特性之一。

封装指的是隐藏对象中一些不希望让外部所访问的属性或方法。

python中封装其实是通过设置访问权限来体现的,私有属性和私有方法是控制访问权限的组成部分。

3.1私有属性

class Bank(object):"""定义了一个银行卡类属性:name     pwd密码【我不希望外部访问】"""def __init__(self, name, pwd):self.name = nameself.__pwd = pwd# 为了在某些需要的时候,访问到私有属性,所以需要在类内部设置两个接口def get_pwd(self):return self.__pwddef set_pwd(self, newpwd):self.__pwd = newpwd# print(Bank.__pwd)b1 = Bank('张三', '123456')
print(b1.name)
# print(b1.__pwd)
print(b1.get_pwd())
b1.set_pwd('666888')
print(b1.get_pwd())

3.2私有方法

class Bank(object):"""定义了一个银行卡类属性:name     pwd密码【我不希望外部访问】"""def __init__(self, name, pwd):self.name = nameself.__pwd = pwddef __info(self):print(f"名字{self.name}, 密码{self.__pwd}")def get_info(self):self.__info()# Bank.__info() 报错
b1 = Bank('李四', '123456')
# b1.__info()   报错
b1.get_info()

3.3属性装饰器

把方法转为属性

class car():def __init__(self, name, color):self.name = nameself.color = colorself.__num = 20@propertydef num(self):return self.__num@num.setterdef num(self, x):if not isinstance(x,int):print('油量必须是数字')else:self.__num += x@num.deleterdef num(self):print("删除油量")del self.__numc1 = car('法拉利', 'red')
print(c1.name, c1.color, c1.num)
c1.num = 'win32'
print(c1.num)
del c1.num

4.类的继承

面向对象的编程带来的主要好处之一就是代码的重用,实现这种重用的方法之一就是通过继承机制。

通过继承创建的新类称之为【子类】或者【派生类】,被继承的类称之为【父类】、【基类】、【超类】

4.1语法格式

class Parent():par_attr=100def __init__(self):print('初始化父类')def par_fun(self):print('父类方法一')def par_dun(self):print('父类方法二')
class Child(Parent):chi_attr=10def __init__(self):print('初始化子类')def chi_dun(self):print('子类方法一')def chi_fun(self):print('子类方法二')
c1=Child()
c1.par_dun()
c1.chi_dun()
p1=Parent()
p1.par_dun()

4.2多继承

class A:pass
class B:pass
class C:pass
class D(A,B,C):pass
d1=D()
print(D.mro())
print(D.__bases__)

这里列出了一些通用的功能,可以在自己的类重写:

  1. __init__ ( self [,args...] ) 构造函数 简单的调用方法: obj = className(args)

  2. __del__( self ) 析构方法, 删除一个对象 简单的调用方法 : del obj

  3. __repr__( self ) 转化为供解释器读取的形式 简单的调用方法 : repr(obj)

  4. __str__( self ) 用于将值转化为适于人阅读的形式 简单的调用方法 : str(obj)

  5. __cmp__ ( self, x ) 对象比较 简单的调用方法 : cmp(obj, x)

class Parent():def __init__(self,x,y):self.x=xself.y=ydef add(self):return self.x+self.y
class Child(Parent):def __init__(self,x,y,z):super().__init__(x,y)self.z=zdef add(self):return super().add()+self.z
c=Child(1,2,3)
print(c.add())

4.3运算符重载

在Python中,并没有像其他语言(如C++)中那样的内置机制来重载运算符。但是,你可以通过定义特定的方法来模拟运算符重载的行为。

以下是一些常见运算符以及它们对应的特殊方法:

加法:+ 对应 __add__

减法:- 对应 __sub__

乘法:* 对应 __mul__

除法:/ 对应 __truediv__

取模:% 对应 __mod__

幂运算:** 对应 __pow__

位运算:

位运算:>> 对应 __rshift__

位运算:& 对应 __and__

位运算:| 对应 __or__

位运算:^ 对应 __xor__

class op():def __init__(self,x,y):self.x=xself.y=ydef __add__(self, other):return (self.x+other.x)**2-self.y-other.y
o1=op(1,3)
o2=op(5,7)
print(o1+o2)

5.多态

class Animal(object):name = '动物'age = 0def speak(self):print("动物的声音")class Dog(Animal):def speak(self):print("汪汪汪")class Cat(Animal):def speak(self):print("喵喵喵")a = Animal()
d = Dog()
c = Cat()a.speak()
d.speak()
c.speak()

6.关于下划线说明

  1. __foo__: 以双下划线开头双下划线结尾,定义的是特殊方法,一般是系统定义名字 ,类似 __init__() 之类的,自动。

  2. _foo: 以单下划线开头的表示的是 protected 类型的变量,即保护类型只能允许其本身与子类进行访问,不能用于 from module import ···

  3. __foo: 双下划线的表示的是私有类型(private)的变量, 只能是允许这个类本身进行访问了。

相关文章:

Python的面向对象day7

1、什么是面向对象 面向对象称为OO,他通过将数据和功能封装在一个被称为‘对象’的实体中,来组织和管理代码。面向对象变成(OOP)具有四个特性,封装、继承、多态、抽象 优点:模块化、安全性高、代码重用性…...

计算机网络(11)和流量控制补充

这一篇对数据链路层中的和流量控制进行详细学习 流量控制(Flow Control)是计算机网络中确保数据流平稳传输的技术,旨在防止数据发送方发送过多数据,导致接收方的缓冲区溢出,进而造成数据丢失或传输失败。流量控制通常…...

Rust 所有权机制

Rust 所有权机制 本文示例代码地址 所有权是Rust中最独特的特性,它让Rust无需GC就可以保证内存安全。 什么是所有权? 所有权(ownership)是 Rust 用于如何管理内存的一组规则。所有程序都必须管理其运行时使用计算机内存的方式…...

Pwn VM writeup

国赛期间,做了一个很有意思的pwn题,顺便学了一下现在常见的pwn的板子题是什么样子的,这里做一下记录 Magic VM 题目逻辑 题目本身其实非常的有趣,它实现了一个简易流水线的功能,程序中包含四个结构体,其中三…...

LSTM(长短期记忆网络)详解

1️⃣ LSTM介绍 标准的RNN存在梯度消失和梯度爆炸问题,无法捕捉长期依赖关系。那么如何理解这个长期依赖关系呢? 例如,有一个语言模型基于先前的词来预测下一个词,我们有一句话 “the clouds are in the sky”,基于&…...

机器学习 贝叶斯公式

这是条件概率的计算公式 𝑃(𝐴|𝐵)𝑃(B|A)𝑃(𝐴)/𝑃(𝐵) 全概率公式 𝑃(𝐵)𝑃(𝐵|𝐴)𝑃(𝐴)&am…...

Scala-注释、标识符、变量与常量-用法详解

Scala Scala-变量和数据类型-用法详解 Scala一、注释二、标识符规范三、变量和常量1. 变量(var)2. 常量(val)3. 类型推断与显式声明4. var 和 val 的区别5. Scala与Java对比Tips: 各位看客老爷万福金安,一键…...

大数据学习14之Scala面向对象--至简原则

1.类和对象 1.1基本概念 面向对象(Object Oriented)是一种编程思想,面向对象主要是把事物给对象化,包括其属性和行为。面向对象编程更贴近实际生活的思想,总体来说面向对象的底层还是面向过程,面向过程抽象…...

docker 安装之 windows安装

文章目录 1: 在Windows安装Docker报19044版本错误的时候,请大家下载4.24.1之前的版本(含4.24.1)2: Desktop-WSL kernel version too low3: docker-compose 安装 (v2.21.0) 1: 在Windows安装Docker报19044版本错误的时候,请大家下载…...

JS 实现游戏流畅移动与按键立即响应

AWSD 按键移动 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>.box1 {width: 400px;height: 400px;background: yellowgreen;margin: 0 auto;position: relative;}.box2 {width: 50px;height:…...

LabVIEW大数据处理

在物联网、工业4.0和科学实验中&#xff0c;大数据处理需求逐年上升。LabVIEW作为一款图形化编程语言&#xff0c;凭借其强大的数据采集和分析能力&#xff0c;广泛应用于实时数据处理和控制系统中。然而&#xff0c;在面对大数据处理时&#xff0c;LabVIEW也存在一些注意事项。…...

NVR录像机汇聚管理EasyNVR多品牌NVR管理工具视频汇聚技术在智慧安防监控中的应用与优势

随着信息技术的快速发展和数字化时代的到来&#xff0c;安防监控领域也在不断进行技术创新和突破。NVR管理平台EasyNVR作为视频汇聚技术的领先者&#xff0c;凭借其强大的视频处理、汇聚与融合能力&#xff0c;展现出了在安防监控领域巨大的应用潜力和价值。本文将详细介绍Easy…...

海思3403对RTSP进行目标检测

1.概述 主要功能是调过live555 testRTSPClient 简单封装的rtsp客户端库&#xff0c;拉取RTSP流&#xff0c;然后调过3403的VDEC模块进行解码&#xff0c;送个NPU进行目标检测&#xff0c;输出到hdmi&#xff0c;这样保证了开发没有sensor的时候可以识别其它摄像头的视频流&…...

Vue之插槽(slot)

插槽是vue中的一个非常强大且灵活的功能&#xff0c;在写组件时&#xff0c;可以为组件的使用者预留一些可以自定义内容的占位符。通过插槽&#xff0c;可以极大提高组件的客服用和灵活性。 插槽大体可以分为三类&#xff1a;默认插槽&#xff0c;具名插槽和作用域插槽。 下面…...

分布式服务高可用实现:复制

分布式服务高可用实现&#xff1a;复制 1. 为什么需要复制 我们可以考虑如下问题&#xff1a; 当数据量、读取或写入负载已经超过了当前服务器的处理能力&#xff0c;如何实现负载均衡&#xff1f;希望在单台服务器出现故障时仍能继续工作&#xff0c;这该如何实现&#xff…...

基于yolov8、yolov5的车型检测识别系统(含UI界面、训练好的模型、Python代码、数据集)

摘要&#xff1a;车型识别在交通管理、智能监控和车辆管理中起着至关重要的作用&#xff0c;不仅能帮助相关部门快速识别车辆类型&#xff0c;还为自动化交通监控提供了可靠的数据支撑。本文介绍了一款基于YOLOv8、YOLOv5等深度学习框架的车型识别模型&#xff0c;该模型使用了…...

机器学习—决定下一步做什么

现在已经看到了很多不同的学习算法&#xff0c;包括线性回归、逻辑回归甚至深度学习或神经网络。 关于如何构建机器学习系统的一些建议 假设你已经实现了正则化线性回归来预测房价&#xff0c;所以你有通常的学习算法的成本函数平方误差加上这个正则化项&#xff0c;但是如果…...

Java Optional详解:避免空指针异常的优雅方式

在 Java 编程中&#xff0c;空指针异常&#xff08;NullPointerException&#xff09;一直是困扰开发者的常见问题之一。为了更安全、优雅地处理可能为空的值&#xff0c;Java 8 引入了 Optional 类。Optional 提供了一种函数式的方式来表示一个值可能存在或不存在&#xff0c;…...

SpringBoot开发——整合EasyExcel实现百万级数据导入导出功能

文章目录 一、EasyExcel 框架及特性介绍二、实现步骤1、项目创建及依赖配置(pom.xml)2、项目文件结构3、配置文件(application.yml)4、启动类 Application.java5、配置类 EasyExcelConfig.java6、服务接口定义及实现 ExcelService.java7、控制器类 ExcelController.java8、…...

AcWing 1097 池塘计数 flood fill bfs搜索

代码 #include <bits/stdc.h> using namespace std;const int N 1010, M N * N;typedef pair<int, int> PII;int n, m;char g[N][N]; bool st[N][N]; PII q[M];void bfs (int xx, int yy) {int hh 0, tt -1;q[ tt] {xx, yy};st[xx][yy] true;while (hh <…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

Git常用命令完全指南:从入门到精通

Git常用命令完全指南&#xff1a;从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...

PostgreSQL——环境搭建

一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在&#xff0…...

第八部分:阶段项目 6:构建 React 前端应用

现在&#xff0c;是时候将你学到的 React 基础知识付诸实践&#xff0c;构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段&#xff0c;你可以先使用模拟数据&#xff0c;或者如果你的后端 API&#xff08;阶段项目 5&#xff09;已经搭建好&#xff0c;可以直接连…...

路由基础-路由表

本篇将会向读者介绍路由的基本概念。 前言 在一个典型的数据通信网络中&#xff0c;往往存在多个不同的IP网段&#xff0c;数据在不同的IP网段之间交互是需要借助三层设备的&#xff0c;这些设备具备路由能力&#xff0c;能够实现数据的跨网段转发。 路由是数据通信网络中最基…...