python【类和面向对象】

1. 概念

面向对象(OOP)是一种对现实世界理解和抽象的方法,对象的含义是指在现实生活中能够看得见摸得着的任何具体事物。Python 是一门面向对象的语言,面向对象编程简单来说就是一种封装代码的方式。

  • 类(Class): 描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法,简单来说就是一个模板,通它来创建对象。对象是类的实例。
  • 实例化:创建一个类的实例,即类的具体对象。
  • 对象:通过类定义的数据结构实例,包括两个数据成员(类变量和实例变量)方法
  • 方法:类中定义的函数。
  • 类变量:类变量在整个实例化的对象中是公用的,它定义在类中且在函数体之外。类变量通常不作为实例变量使用。
  • 局部变量:方法中定义的变量,只作用于当前实例。
  • 实例变量:在类的声明中,用来表示属性的变量,实例变量就是一个用 self 修饰的变量。
  • 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。
  • 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称方法的重写。

面型对象的三大特征

【封装】

面型对象编程的核心思想,将对象的属性和行为封装起来,其载体是。类会隐藏对象的属性和实现细节,仅对外提供公共访问方式,避免外部数据对内部数据结构的影响,保证类的内部数据结构的完整性,又提高复用性、可维护性和安全性。

【继承】

继承是实现重复利用的重要手段,派生类继承基类的字段和方法,也可以添加自己特有的属性和行为。继承允许把派生类对象作为基类对象对待。

【多态】

将父类对象应用于子类特征就是多态,即父类定义的引用变量可以指向子类的实例对象,子类继承父类特征的同时,也具备自己的特征,能够实现不同的效果,提高了程序的拓展性。


2. 类的定义和使用

2.1 定义类

语法结构

class 类名:
    属性
    ...
    方法
    ...

# 定义一个简单的类
class MyClass:i = 12345def hw(self):return 'hello world'

 

2.2 创建类的实例:实例化类对象

python中创造实例不使用 new。当创建一个类时,没有创建 __init__() 方法或当 __init__() 方法只有一个 self 参数时,可以省略可选参数。

语法格式

实例名 = 类名(可选参数)

# 实例化类
helloWorld = MyClass()
  • 类创建后,类通常会自动创建一个特殊的 __init__() 方法,和 Java 相似,每当创建一个类的新实例,python 都会自动执行它。
  • __init__() 方法必须包含一个 self 参数,而且必须是第一个参数。类的方法与普通的函数只有一个特别的区别,它们必须有一个额外的第一个参数名称 self,self 是指向实例本身的引用,代表当前对象的地址,用于访问类中的属性和方法,在方法调用时会自动传递实际参数 self。
  • 类对象创建后,类命名空间中所有的命名都是有效属性名。

 __init__() 方法可以有参数,参数通过 __init__() 传递到类的实例化操作上:

class Cat:# 属性color = 'black'# 构造方法def __init__(self, name):self.name = name# 自定义方法def eat(self, food):self.food = foodprint(self.name, '正在吃'+food)

 

2.3 创建类成员并访问

类创建好后,我们可以直接通过类名访问属性。

语法格式

类名.属性名 / 方法名

# 访问类的属性和方法
print("MyClass 类的属性 i 为:", x.i)
print("MyClass 类的方法 f 输出为:", x.f())

【访问限制】

在类的内部可以定义属性和方法,在类的外部可以直接调用属性和方法来作操作数据。为了保证类内部的某些属性不被外界访问,可以在属性或方法名前添加:

  • 单下划线:表示 protected 成员,只允许类本身和子类访问,不能使用 “from module import *” 导入。保护属性可通过实例名访问。
  • 双下划线:表示 private 成员,只允许定义该方法的类本身访问,不能通过类的实例名访问,但可以通过 “实例名.类名 __xxx” 访问。
  • 首尾双下划线:特殊方法,一般是系统定义的。

2.4 类的专有方法

__init__  

构造函数,在生成对象时调用
__del__析构函数,释放对象时使用
__repr__ 打印,转换
__setitem__按照索引赋值
__getitem__按照索引获取值
__len__获得长度
__cmp__比较运算
__call__函数调用
__add__加运算
__sub__减运算
__mul__乘运算
__truediv__除运算
__mod__求余运算
__pow__乘方

2.5 继承

Python 支持类的继承,而且支持多继承:

语法格式

class 子类(基类1, 基类2 ...):
    ...

基类名必须与派生类定义在一个作用域内。除了类,还可以用表达式,基类定义在另一个模块中时这一点非常有用:

class 子类名(模块名.基类名):

#类定义
class people:#定义基本属性name = ''age = 0#定义私有属性,私有属性在类外部无法直接进行访问__weight = 0#定义构造方法def __init__(self,n,a,w):self.name = nself.age = aself.__weight = wdef speak(self):print("%s 说: 我 %d 岁。" %(self.name,self.age))#单继承示例
class student(people):grade = ''def __init__(self,n,a,w,g):#调用父类的构函people.__init__(self,n,a,w)self.grade = g#覆写父类的方法def speak(self):print("%s 说: 我 %d 岁了,我在读 %d 年级"%(self.name,self.age,self.grade))#另一个类,多继承之前的准备
class speaker():topic = ''name = ''def __init__(self,n,t):self.name = nself.topic = tdef speak(self):print("我叫 %s,我是一个演说家,我演讲的主题是 %s"%(self.name,self.topic))#多继承
class sample(speaker,student):a =''def __init__(self,n,a,w,g,t):student.__init__(self,n,a,w,g)speaker.__init__(self,n,t)test = sample("Tim",25,80,4,"Python")
test.speak()   #方法名同,默认调用的是在括号中参数位置排前父类的方法


3. 特殊属性

python 有一种属性,访问它时将计算它的值,该属性还可以为其他属性添加安全保护机制。

3.1 创建用于计算的属性

通过 @property(装饰器) 将一个方法转为属性,从而实现用于计算的属性。将方法转换为属性后,可以直接通过方法名来访问方法,而不需要添加 ()。

语法格式

@property

def 方法名(self):

    方法体

3.2 为属性添加安全保护机制

默认情况,创建的类属性或实例名是可以在类体外进行修改的,如果想要限制其不能在类体外修改,可以将其设为私有的,但是设为私有后,在体外也不能获取它的值。而使用 @property 可以实现只读属性。

语法格式

@property

def 方法名(self):

    方法体


4. 方法重写

派生类中定义 __init__() 方法时,不会自动调用基类的 __init__() 方法。因此要在派生类中使用基类 __init__() 方法,必须要进行初始化,需要在派生类中使用 super() 函数调用基类的 __init__() 方法。

class Parent:        # 定义父类def myMethod(self):print ('调用父类方法')class Child(Parent): # 定义子类def myMethod(self):print ('调用子类方法')c = Child()          # 子类实例
c.myMethod()         # 子类调用重写方法
super(Child,c).myMethod() #用子类对象调用父类已被覆盖的方法

【运算符重载】

class Vector:def __init__(self, a, b):self.a = aself.b = bdef __str__(self):return 'Vector (%d, %d)' % (self.a, self.b)def __add__(self,other):return Vector(self.a + other.a, self.b + other.b)v1 = Vector(2,10)
v2 = Vector(5,-2)
print (v1 + v2)

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

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

相关文章

揭秘Map与Set的键值奥秘与集合魅力,解锁高效数据魔法

文章目录 前言➰一、关联式容器1.1 关联式容器的概述1.2 关联式容器的工作原理1.3 关联式容器的核心特性 ➰二、键值对2.1 键值对的基本概念2.2 键值对在C中的实现 ➰三、树形结构的关联式容器3.1 树形结构的特点3.2 使用场景 ➰四、set的使用与定义4.1 set的基本特性4.2 set的…

Flutter UI组件库(JUI)

Flutter UI组件库 (JUI) 介绍 您是否正在寻找一种方法来简化Flutter开发过程,并创建美观、一致的用户界面?您的搜索到此为止!我们的Flutter UI组件库(JUI)提供了广泛的预构建、可自定义组件,帮助您快速构建…

RHCE--ntp客户端,时间服务器服务端

NTP 是网络时间协议( Network Time Protocol )的简称,通过 udp 123 端口进行网络时钟同步。 Chrony 是一个开源自由的网络时间协议 NTP 的客户端和服务器软件。它能让计算机保持系统时钟与时钟服务器( NTP )同步&#…

计算机网络:数据链路层 —— 以太网(Ethernet)

文章目录 局域网局域网的主要特征 以太网以太网的发展100BASE-T 以太网物理层标准 吉比特以太网载波延伸物理层标准 10吉比特以太网汇聚层交换机物理层标准 40/100吉比特以太网传输媒体 局域网 局域网(Local Area Network, LAN)是一种计算机网络&#x…

基于SSM果蔬经营系统的设计

管理员账户功能包括:系统首页,个人中心,用户管理,商品信息管理,类型管理,系统管理,订单管理 前台账号功能包括:系统首页,个人中心,商品信息,广告…

爬虫+数据保存

爬虫以及数据保存 这篇文章, 分享如何将爬虫爬到的数据, 保存到excel表格当中。 文章目录 1.安装保存数据的第三方库openpyxl并使用 2.爬虫加单表数据保存 3.爬虫加多表数据保存 4.实战 一、安装保存数据的第三方库openpyxl并使用 我们需要安装openpyxl的第三方库 安装…

Qt第十三天:网络编程:TCP和UDP的使用

我发现了有些人喜欢静静看博客不聊天呐, 但是ta会点赞。 这样的人呢帅气低调有内涵, 美丽大方很优雅。 说的就是你, 不用再怀疑哦 ❤️TCP: 一、创建项目,命名为Server,继承QWidget 二、添加Qt设计师…

CentOS7安装RabbitMQ-3.13.7、修改端口号

本文安装版本: Erlang:26.0 官网下载地址 Erlang RabbitMQ:3.13.7 官网下载地址 RabbitMQ RabbitMQ和Erlang对应关系查看:https://www.rabbitmq.com/which-erlang.html 注:安装erlang之前先安装下依赖文件&#xff0…

云黑系统全解无后门 +搭建教程

这套系统呢是玖逸之前南逸写的一套云黑系统,功能带有卡密生成和添加黑名单等,源码放在我的网盘里已经两年之久,由于玖逸现在已经跑路了所以现在发出来分享给大家,需要的可以自己拿去而开,反正功能也不是很多具体的自己…

Teledyne LeCroy:800G高速以太网一站式自动化测试解决方案(网络打流测试+物理层加压干扰+协议分析)

LinkExpert一站式测试解决方案 LinkExpert 是一款软件应用程序,可对Teledyne LeCroy的协议分析仪和训练器进行自动化硬件控制和管理。除了作为合规性、一致性和验证测试的便捷接口外,它还能轻松地将这些测试添加到自动回归测试流程中。 现在,…

WPF基础权限系统

一.开发环境 VisualStudio 2022NET SDK 8.0Prism 版本 8.1.97Sqlite 二. 功能介绍 WPF 基础权限系统,是一个支持前后端分离设计的 客户端(C/S)项目,该示例项目前端xaml使用UI库 ,Material Design Themes UI 来构建用户界面,确保…

C# -- Abstract、Virtual、interface

一、Virtual方法(虚方法) 1)virtual 关键字用于在基类(父类)中修饰方法 2)基类中定义了virtual方法,派生类中使用override重写该方法 二、Abstract方法(抽象方法) 1&…

【ssh】Mac 使用 ssh 连接阿里云报错:Connection reset by 8.155.1.xxx port 22

Mac 使用 ssh 连接阿里云报错:Connection reset by 8.155.1.xxx port 22 问题描述解决办法 问题描述 Connection reset by 8.155.1.xxx port 22解决办法 关掉代理 VPN

CTFHUB技能树之XSS——存储型

开启靶场&#xff0c;打开链接&#xff1a; 发现地址栏中的URL没有GET传参&#xff0c;而且这次是“Hello&#xff0c;no name” 还是跟反射型一样的流程&#xff1a; 先注入一下看看&#xff1a; <script>alert(1)</script> 但界面的结果还是“Hello&#xff0c…

【网络协议】之 HTTP 协议详解

HTTP 协议是 Web 的基石&#xff0c;它定义了客户端和服务器之间的通信规则。本文将深入地探讨 HTTP 的核心概念&#xff0c;包括工作原理、请求方法、状态码以及不同 HTTP 版本的演进。 一、HTTP 的工作原理 HTTP 协议基于客户端-服务器模型&#xff0c;遵循请求-响应的循环&…

FineReport 计算同比增长

1、数据库查询 SELECTt1.年,t1.月,t1.总金额 AS 同期金额,t1.仓库名称,t2.总金额 AS 上期金额 FROMtest t1LEFT JOIN test t2 ON ( t1.年 t2.年 1 ) AND t1.月 t2.月 AND t1.仓库名称 t2.仓库名称2、配置字段 月份字段加后缀 月 数据列加后缀 计算同比增长率 if(LEN(B3)0 …

2024年五一杯数学建模C题煤矿深部开采冲击地压危险预测求解全过程论文及程序

2024年五一杯数学建模 C题 煤矿深部开采冲击地压危险预测 原题再现&#xff1a; “煤炭是中国的主要能源和重要的工业原料。然而&#xff0c;随着开采深度的增加&#xff0c;地应力增大&#xff0c;井下煤岩动力灾害风险越来越大&#xff0c;严重影响着煤矿的安全高效开采。在…

VScode背景更改

效果 实现方法 第0步 以管理员身份运行VScode 首先 需要安装这个扩展 然后 接下来 找到配置文件 再后来 在配置文件的下面但不超过最后一个大括号的地方加入以下内容 "update.enableWindowsBackgroundUpdates": true,"background.fullscreen": {…

Nature 正刊丨群体爆发中的神经元序列在人类皮层中编码信息

01摘要 传统上&#xff0c;神经编码是通过对不同刺激的放电率和潜伏期的变化来检查的1,2,3,4,5。然而&#xff0c;神经元群体也可能表现出短暂的尖峰活动爆发&#xff0c;其中神经元以特定的时间顺序或序列放电6,7,8。人脑可以利用群体爆发中的这些神经元序列来有效地表示信息…

React中的useState和useEffect解析

一、组件状态管理——useState 1.定义 useState 是一个 React Hook&#xff08;函数&#xff09;&#xff0c;它允许我们向组件添加一个状态变量&#xff0c;从而控制影响组件的渲染结果 和普通JS变量不同的是&#xff0c;状态变量一旦发生变化组件的视图UI也会跟着变化&…