Python之面向对象程序设计

文章目录

    • 1、类定义
    • 2、创建实例
    • 3、属性
    • 4、方法
    • 5、继承
    • 6、多态
    • 7、组合
    • 8、导入类

1、类定义

面向对象程序设计的一个关键性观念是将数据以及对数据的操作封装在一起,组成一个相互依存、不可分割的整体,即对象。对于相同类型的对象进行分类、抽象后,得出共同的特征而形成了类,面向对象程序设计的关键就是如何合理地定义和组织这些类以及类之间的关系

Python完全采用了面向对象程序设计的思想,是真正面向对象的高级动态编程语言,完全支持面向对象的基本功能,如封装、继承、多态以及对基类方法的重写(覆盖)



1.1、规范:

类名、实例名和模块名要规范,并在整个系统中保持风格一致。 类名一般推荐用大驼峰式命名法(每个单词的首字母大写,并且不使用下划线),实例名和模块名推荐下划线命名法(又称蛇形命名法,全小写,并在单词之间加上下划线

每个类定义后的第一行和模块文件的首行,都应包含一个说明性字符串,简要描述类的功能。

使用两个空行来分隔不同类,使用一个空行分隔类内的不同方法

当使用 import 语句时,使用一个空行分隔标准库和自己的库


1.2、类的定义

class 关键字用于定义类
由于是新定义的全新类,所以类名后面直接跟冒号。也可以是class Dog:
一般类名以大写字母开头
紧随其后的是类的功能描述(不是必需)

构造函数( __init__()
和定义其他函数一样,也使用 def 关键字。
该函数有一些特殊的地方:
函数名的开头和末尾各有两个下划线。这是一种约定,旨在避免命名冲突。
每次创建 Dog 类的实例, Python 都会自动运行这个函数
一般称之为初始化方法或构造函数

init()函数的函数体

第一行是说明性注释
第二行定义的私有变量以 self. 为前缀
这个私有变量可在类的内部所有方法中通过同样的 self. 前缀来使用
但在类的外部不能直接访问,需要特殊方法访问

class Dog(object):def __init__(self, nick):"""初始化私有数据成员(变量) nick"""self.__nick = nickdef show_info(self):print(f"My dog's nick is {my_dog.__nick}.")def roll_over(self):"""模拟小狗收到命令时打滚"""print(f"{self.__nick} rolled over!")my_dog= Dog("爪爪")
my_dog.roll_over()
my_dog.show_info()

2、创建实例

通过箭头处的代码:
创建了一条昵称为 '爪爪’的小狗。
不需要传入 self 实参, Python 会在调用初始化方法时自动传入它
通过接收实参,初始化方法将会设置 nick数据成员,表示小狗的昵称,随后返回表示小狗的实例
最后将这个实例赋值给 my_dog 变量

my_dog=Dog("爪爪")

创建类的实例后,使用点号语法来调用实例的方法,从而让实例“动起来”
Python 会在类中查找调用的方法,然后运行方法体中的语句

my_dog = Dog('爪爪')
my_dog.roll_over()

3、属性

class Car(object):   def __init__(self, make,year):self.__make = makeself.__year = yearself.__price = 0def get_describe(self):long_name = f"{self.__make}-{self.__year}-{self.__price}"return long_name.title()def __get(self):return self.__price def __set(self, v):self.__price = vPrice = property(__get, __set)
car = Car('audi', 2023)
car.Price=10000
print(car.get_describe(),car.Price)
>>> #只读,无法修改和删除
class Test:def __init__(self, value):self.__value = value    def __get(self):return self.__valuevalue = property(__get)
>>> t = Test(3)
>>> t.value
3
>>> t.value = 5                        #只读属性不允许修改值
AttributeError: can't set attribute
>>> t.v=5              #动态增加新成员
>>> t.v
5
>>> del t.v            #动态删除成员
>>> del t.value        #试图删除对象属性,失败
AttributeError: can't delete attribute
>>> t.value
3

4、方法

静态方法和类方法都可以通过类名和对象名调用,但不能直接访问属于对象的成员,只能访问属于类的成员。
静态方法和类方法不属于任何实例,不会绑定到任何实例,当然也不依赖于任何实例的状态,与实例方法相比能够减少很多开销。
类方法一般以cls作为类方法的第一个参数表示该类自身,在调用类方法时不需要为该参数传递值,静态方法则可以不接收任何参数。

>>> class Root:__total = 0def __init__(self, v):    #构造方法self.__value = vRoot.__total += 1def show(self):           #普通实例方法print('self.__value:', self.__value)print('Root.__total:', Root.__total)@classmethod              #修饰器,声明类方法def classShowTotal(cls):  #类方法print(cls.__total)@staticmethod             #修饰器,声明静态方法def staticShowTotal():    #静态方法print(Root.__total)>>> r = Root(3)
>>> r.classShowTotal() #通过对象来调用类方法
1
>>> r.staticShowTotal() #通过对象来调用静态方法
1
>>> r.show()
self.__value: 3
Root.__total: 1
>>> Root.classShowTotal()  #通过类名调用类方法
2
>>> Root.staticShowTotal() #通过类名调用静态方法
2

5、继承

在编写类时,并非总是要从头开始,如果要编写的类是一个已有类的特殊版本,则我们可以使用继承(inheritance)
被继承的类称为父类(parent class),而继承的类称为子类(child class)
子类可以继承父类的所有属性和方法,也可以定义自己的属性和方法

下面来模拟电动汽车,电动汽车是一种特殊的汽车,和之前的汽车一样,它也有里程表,也需要能够显示信息。
因此可在之前 Car 类的基础上,创建它的继承类 ElectricCar。
使用继承后,只需为电动汽车特有的属性和行为编写代码即可。

class Car(object):   def __init__(self, make,year):self.__make = makeself.__year = yearself.__price = 0        def get_describe(self):long_name = f"{self.__make}-{self.__year}-{self.__price}"return long_name.title()def __get(self):return self.__price def __set(self, v):self.__price = vPrice = property(__get, __set)

6、多态

当父类中定义的一些方法不能满足子类的要求时,可以在子类中随时重写父类的方法:定义一个同名的方法
当调用子类生成的实例时,Python 首先会查找子类中的方法,从而忽略父类中被重写的同名方法
所谓多态(polymorphism),是指基类的同一个方法在不同派生类对象中具有不同的表现和行为。派生类继承了基类行为和属性之后,还会增加某些特定的行为和属性,同时还可能会对继承来的某些行为进行一定的改变,这都是多态的表现形式。

class Car(object): def show(self):print("car...")class ElectricCar(Car):def show(self):print("electric car...")    car = Car()
car.show()ec=ElectricCar()
ec.show()
>>> class Animal(object):      #定义基类def show(self):print('I am an animal.')>>> class Cat(Animal):         #派生类,覆盖了基类的show()方法def show(self):print('I am a cat.')
>>> class Dog(Animal):         #派生类def show(self):print('I am a dog.')>>> class Test(Animal):        #派生类,没有覆盖基类的show()方法pass

7、组合

随着属性和方法越来越多,类定义的代码行可能会越来越长。
为了解决这一问题,我们可以将类中的一部分属性和方法提取出来,作为一个独立的类,这种方法称为组合(composition):

class Car(object):   def __init__(self, year):self.__year = yeardef get_describe(self):s = f"{self.__year}"return s.title()class Battery:def __init__(self, size=40):self.size = sizedef describe_battery(self):print(f"{self.size}-kWh battery.")

8、导入类

为了避免一个文件中包含过多的类,可以把不同类存储在不同文件中。
例如, Car类放在Class_car07_part1文件中,而ElectricCar类放在Class_car07_part2文件中,并在开头加一句代码

from Class_car07_part1  import Carclass ElectricCar(Car):def __init__(self, year,price):……

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

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

相关文章

字符处理 C语言xdoj52

问题描述 从键盘输入一个字符,若为小写字母,则输出其对应的大写字母;若为大写字母,则输出对应的小写字母;其他字符原样输出。 输入说明 输入一个字符 输出说明 输出一个字符 输入样例 样例1输入 a 样例…

分布式块存储 ZBS 的自主研发之旅|元数据管理

重点内容 元数据管理十分重要,犹如整个存储系统的“大黄页”,如果元数据操作出现性能瓶颈,将严重影响存储系统的整体性能。如何提升元数据处理速度与高可用是元数据管理的挑战之一。SmartX 分布式存储 ZBS 采用 Log Replication 的机制&…

安装ingress-nginx

1、下载helm压缩包 wget https://get.helm.sh/helm-v3.2.3-linux-amd64.tar.gz2、解压 [rootk8s-master-10 helm]# tar -zxvf helm-v3.2.3-linux-amd64.tar.gz linux-amd64/ linux-amd64/README.md linux-amd64/LICENSE linux-amd64/helm3、进入linux-amd64 [rootk8s-maste…

论文修改润色平台 PaperBERT

大家好,今天来聊聊论文修改润色平台,希望能给大家提供一点参考。 以下是针对论文重复率高的情况,提供一些修改建议和技巧: 标题:论文修改润色平台――助力学术研究,提升论文质量 一、引言 在学术研究中&am…

复制粘贴——QT实现原理

复制粘贴——QT实现原理 QT 剪贴板相关类 QClipboard 对外通用的剪贴板类,一般通过QGuiApplication::clipboard() 来获取对应的剪贴板实例。 // qtbase/src/gui/kernel/qclipboard.h class Q_GUI_EXPORT QClipboard : public QObject {Q_OBJECT private:explici…

单片机——通信协议(FPGA+c语言应用之spi协议解析篇)

引言 串行外设接口(SPI)是微控制器和外围IC(如传感器、ADC、DAC、移位寄存器、SRAM等)之间使用最广泛的接口之一。本文先简要说明SPI接口,然后介绍ADI公司支持SPI的模拟开关与多路转换器,以及它们如何帮助减少系统电路板设计中的数…

ChatGLM大模型推理加速之Speculative Decoding

目录 一、推测解码speculative decoding 1、自回归解码 2、speculative decoding 3、细节理解 二、核心逻辑代码 1、算法流程代码 2、模型自回归代码 a、带缓存的模型自回归实现代码 b、优化版本带缓存的模型自回归实现代码 c、ChatGLM的past_key_values的回滚 三、…

要求CHATGPT高质量回答的艺术:提示工程技术的完整指南—第 21 章:课程学习提示

要求CHATGPT高质量回答的艺术:提示工程技术的完整指南—第 21 章:课程学习提示 课程学习是一种技术,它允许模型通过首先训练较简单的任务并逐渐增加难度来学习复杂的任务。 要在 ChatGPT 中使用课程学习提示,应为模型提供一系列…

EM的理论基础

1 EM定义​ 电迁移(Electro-Migration)是指在外加电场下,电子和金属原子之间的动量转移导致材料的运动。这种动量传递导致金属原子(比如Cu原子)从其原始位置移位,如图7-1。这种效应随着导线中电流密度的增加而增加,并且在更高的温度下,动量传递变得更加严重。因此,在先…

[WMCTF2020]Make PHP Great Again require_once 特性

php源码分析 require_once 绕过不能重复包含文件的限制-安全客 - 安全资讯平台 这里是特性 我们首先来解释一下 <?php highlight_file(__FILE__); require_once flag.php; if(isset($_GET[file])) {require_once $_GET[file]; }这个是我们的源代码 PHP包含的格式是将 已…

考验的是技术!如何绕过微软设计的安装Windows 11的硬件要求

这篇文章解释了绕过微软设计的硬件要求的三种方法,允许你在几乎任何电脑上安装Windows 11。 注意:绕过Windows 11要求所涉及的一些过程需要更深入的技术知识。请不要编辑计算机的注册表,除非你对此乐此不疲,因为它可能会损坏你的设备。 绕过Windows 11要求 虽然绕过Wind…

AUTO.js连接电脑时,握手失败

使用模拟器上的autox.js连接vscode。ipv4正确&#xff0c;但总是握手失败。 检查了一下vscode安装的插件&#xff0c;最开始安装的是这个&#xff1a; 将之前安装的插件禁用。 更换这个插件&#xff1a; 然后启动服务后就可以连接成功了。

Nginx服务器配置SSL证书

本文将全面介绍如何在Nginx或Tengine服务器配置SSL证书&#xff0c;具体包括下载和上传证书文件&#xff0c;在Nginx上配置证书文件、证书链和证书密钥等参数&#xff0c;以及安装证书后结果的验证。成功配置SSL证书后&#xff0c;您将能够通过HTTPS加密通道安全访问Nginx服务器…

成分党品牌

现在越来越多的成分党品牌崛起&#xff0c;主打成分护肤&#xff0c;不添加任何成分&#xff0c;其中有Timeless、The Ordinary、John Jeff、欧邦琪&#xff08;Obagi&#xff09;、修丽可&#xff08;SkinCeuticals&#xff09;、HFP 。 参考文章&#xff1a;成分党都会良心推…

试以单链表为存储结构实现简单选择排序的算法

简单选择排序&#xff0c;就是每趟把剩余元素最小或者最大的选出来排到前面 这道题值得推敲的是&#xff0c;p作为一个链表结点也是可以作为for循环的初始条件和判断条件的&#xff0c;至于查找到最小值之后&#xff0c;可以把两者的数值进行一个交换&#xff0c;就不用删结点…

怎么抠图换背景?这三个方法让你轻松抠图

怎么抠图换背景&#xff1f;抠图是每个独立站商家每天必不可少的工作&#xff0c;简单一张图用PS进行抠图还好&#xff0c;但如何多张图&#xff0c;用PS就效率非常低&#xff0c;且需要专业的PS技能才能上手实现精准抠图的目的&#xff0c;那么怎么快速抠图换背景呢&#xff0…

risc-v system instruction

ECALL ecall 指令以前叫做 scall&#xff0c;用于执行环境的变更&#xff0c;它会根据当前所处模式触发不同的执行环境切换异常, 用来执行需要更高权限才能执行的功能; 简单来说&#xff0c;ecall 指令将权限提升到内核模式并将程序跳转到指定的地址。操作系统内核和应用程序…

检测车牌的SIFT特征并匹配

# 代码5-14 检测车牌的SIFT特征并匹配 import cv2img1 cv2.imread(../data/plate.jpg) img2 cv2.imread(../data/car.jpg)sift cv2.SIFT_create() # 利用sift.detectAndCompute()函数找到特征点&#xff0c;计算描述符&#xff1b; kp1, des1 sift.detectAndCompute(img1, …

web279(s2-001)

目前java小白一个&#xff0c;主要是学学别人的思路 进入题目&#xff0c;登录框一个 抓包也没发现什么东西 网上说是struts2框架 Struts2是用Java语言编写的一个基于MVC设计模式的Web应用框架 判断是不是基于struts2的一些方法&#xff1a; 1.通过页面回显的错误消息来判断…

6.5.编解码器信息的收集

那在上节课中呢&#xff1f;我向你介绍了add track相关的内容&#xff0c;那今天呢&#xff1f;我们来看看编解码器信息的收集。那在这里呢&#xff0c;我们需要问几个重要的问题&#xff0c;那首先呢&#xff0c;就是我们上节课通过&#xff0c;可以让web rtc知道我们都要传输…