[Python学习篇] Python面向对象——类

面向对象是什么?

面向对象(Object-Oriented Programming,简称OOP)是一种编程范式,它使用“对象”来设计应用程序和计算机程序。OOP的核心概念包括类(Class)、对象(Object)、封装(Encapsulation)、继承(Inheritance)、多态(Polymorphism)等。

类是什么?

在 Python 中,类是一种创建对象的模板,定义了对象的属性和方法。通过类可以创建具有相同属性和行为的对象实例。

什么是属性?

属性即是特征,比如:人类的名字、年龄、身高、体重...等特征。

什么是方法?

方法即是动作,比如:人类吃饭、搬砖...等行为。

定义类

语法:

class 类名(父类名):

    属性
    初始化方法

    实例方法
    ......

注意:

类名要满足标识符命名规则,同时要遵循大驼峰命名习惯。类名后面的小括号`()`是写继承的类名的。如果没有继承,可以省略小括号,比如 `class 类名:`

示例:定义类,并使用类创建对象

# 创建类
class Test:# 定义属性name = "我是变量,在类中我叫属性"# 定义初始化方法def __init__(self):print("我是初始化方法")# 定义实例方法def test(self):print("我是普通函数,在类中我叫实例方法")# 使用类
# 通过类创建的变量,这里叫做对象
test = Test()  # 使用类创建一个对象,这里创建对象时使用的是初始化方法
print(test.name)  # 使用类中的属性
print(test.test())  # 使用类中的实例方法

self 讲解

class Test:name = "我是变量,在类中我叫属性"# self 是指向这个类的对象,用于引用调用类中的属性和方法。def test(self):# 比如我在类中想使用类中的属性或者方法。# print(name) #这种方法语法报错print(self.name)  # self.name 可以调用成功test = Test()
test.test()

类外面添加对象属性

语法:

对象名.属性名 = 值

示例:

class Test:name = "Tom"test = Test()
# 添加属性
test.age = 18# 使用属性
print(test.age)

类里面使用对象属性/方法

语法:

self.属性名

self.方法名()

示例:

class Test:def hello(self):# 类中使用类外的属性print(self.age)test = Test()
# 类外添加属性
test.age = 18print(test.hello())

魔法方法

在Python中, __xx__() 的函数叫做魔法方法(Magic Methods),也被称为双下划线方法(Dunder Methods),指的是具有特殊功能的函数,并与 Python 的内置操作符和函数交互。

`__init__` 初始化方法,构造函数。

class Test:def __init__(self, name, age):self.name = nameself.age = agetest = Test('Tom', 18)
print(test.name)  # Tom
print(test.age)  # 18

`__dict__` 打印对象的所有属性值。vars()也是这个作用。

class Test:def __init__(self, name, age):self.name = nameself.age = agetest = Test('Tom', 18)
print(test.__dict__)  # {'name': 'Tom', 'age': 18}
print(vars(test))  # {'name': 'Tom', 'age': 18}

`__str__`  print 打印对象时以字符串表示形式。同比java中的toString方法

class Test:def __init__(self, name, age):self.name = nameself.age = agedef __str__(self):return f'Test(name={self.name}, age={self.age})'test = Test('Tom', 18)
print(test)  # Test(name=Tom, age=18)
print(test.__str__())  # Test(name=Tom, age=18)
print(str(test))  # Test(name=Tom, age=18)

`__repr__` 与 __srt__类似,下面是它们的比较

class Test:def __init__(self, name, age):self.name = nameself.age = agedef __str__(self):return f'Test(name={self.name}, age={self.age})'def __repr__(self):return f'Person({self.name!r}, {self.age!r})'test = Test('Tom', 18)
print(test)  # Test(name=Tom, age=18)
print(repr(test))  # Person('Tom', 18)

`__call__` 可以让对象像方法一样被调用。作用是可以隐式的调用类中其他的方法,已经由call显示的调用了其他方法。

class Test:name = 'Tom'def __call__(self):self.hello()def hello(self):print(f"hello {self.name}")test = Test()
# 我们想调用类中的 hello 方法时,可以直接这样调用,hello已经由call调用了
test()  # hello Tom

`__del__` 析构函数,在对象被垃圾回收(或者我们主动使用del函数)时被调用。用于执行一些清理操作,例如关闭文件、释放资源等。

class Test:name = 'Tom'def __del__(self):# 这里可以写一些关闭资源的操作print(f"对象已经被删除.")test = Test()
del test  # 对象已经被删除.

Python中还有什么很多魔法方法,这里就不一一演示了。

私有属性和私有方法

在Python中,私有权限(Private Access)用于限制类属性和方法的访问,即私有属性和私有方法。使其只能在类内部使用。这是通过命名约定和名称改写(name mangling)机制来实现的。

_ 单下划线 (受保护)

单下划线前缀表示“受保护的”变量或方法。这是一种约定,表示这些变量或方法不应该不推荐在类外部直接使用,虽然它们仍然可以被访问。

示例:

class Hello:def __init__(self):self._protected_var = "我是受保护的属性"def _protected_method(self):return "我是受保护的方法"hello = Hello()
# 依然可以访问到,但是不推荐不应该访问
print(hello._protected_var)          # 输出:我是受保护的属性
print(hello._protected_method())     # 输出:我是受保护的方法
__ 双下划线 (私有)

双下划线前缀用于实现名称改写(name mangling),使得属性或方法在类外部无法轻易访问。Python会将这些名称改写为 _ClassName__variableName 的形式,从而实现基本的私有化。

示例:

get 私有属性

class Hello:__private_var = "我是私有的属性"def __private_method(self):return "我是私有的方法"# 用于访问私有属性def get_private_var(self):return self.__private_var# 用于访问私有方法def get_private_method(self):return self.__private_method()hello = Hello()
# 以下访问会报错
# print(hello.__private_var)      # 出异常 AttributeError
# print(hello.__private_method()) # 出异常 AttributeError# 方式一:
# 通过类内部方法间接访问
print(hello.get_private_var())          # 输出:我是私有的属性
print(hello.get_private_method())       # 输出:我是私有的方法# 方式二:
# 通过名称改写访问,改写规则是 `_类名__变量方法名`
print(hello._Hello__private_var)        # 输出:我是私有的属性
print(hello._Hello__private_method())   # 输出:我是私有的方法

set 私有属性

class Hello:__private_var = "20"# 获取私有属性值def get_private_var(self):return self.__private_var# 修改私有属性值def set_private_var(self, __private_var):self.__private_var = __private_varhello = Hello()# 获取修改前的数据
print(hello.get_private_var())  # 20# 修改数据
hello.set_private_var("10")# 获取修改后的数据
print(hello.get_private_var())  # 10

类属性和实例属性

类属性

Python类属性就是Java中的常量。

类属性是属于类本身的属性,它被所有该类的实例共享。可以通过类名访问类属性,也可以通过实例访问(如果实例没有同名的实例属性,则会访问类属性)。类属性通常在类的定义体中直接定义,并且在整个类的生命周期中保持不变。类属性可以通过类修改,不能通过实例对象修改,如果使用实例对象修改类属性,表示的是创建了一个和类属性同名的实例属性。

示例:

class Hello:# 类属性name = "Tom"# 通过类直接访问
print(Hello.name)  # 输出:Tom# 通过对象访问
hello = Hello()
print(hello.name)  # 输出:Tom
实例属性

实例属性是属于类的实例的属性,每个实例都有自己的一组实例属性。通常在实例化对象时通过构造函数 __init__ 中初始化实例属性。实例属性是与特定实例相关联的,不同实例的同名实例属性可以有不同的值。

示例:

class Hello:def __init__(self, name, age):self.name = name    # 实例属性self.age = age      # 实例属性tom = Hello("Tom", 18)
jerry = Hello("Jerry", 25)print(tom.__dict__)    # {'name': 'Tom', 'age': 18}
print(jerry.__dict__)  # {'name': 'Jerry', 'age': 25}

类方法和静态方法

在Python中,类方法(Class Method)和静态方法(Static Method)是与类相关联的两种特殊类型的方法,它们不同于普通的实例方法,具有特定的使用场景和功能。

类方法

类方法使用 @classmethod 装饰器声明的方法,它第一个参数通常被命名为 cls,表示类本身。类方法可以通过类名调用,也可以通过实例调用。类方法主要有以下特点:

  • 类方法可以访问和修改类级别的属性,即类属性。
  • 类方法通常用于对类属性进行操作或者返回类的实例。
  • 可以在类方法内部通过 cls 参数访问其他类方法或静态方法。

示例:

class Car:car_count = 0  # 类属性def __init__(self, brand, model):self.brand = brand  # 实例属性self.model = model  # 实例属性Car.car_count += 1  # 每创建一个实例,类属性加1@classmethoddef get_car_count(cls):return cls.car_count# 调用这个方法,类比在调用初始化方法__init__@classmethoddef create_instance(cls, brand, model):return cls(brand, model)# 使用类方法
print(Car.get_car_count())  # 输出: 0car1 = Car.create_instance("Benz", "May bach")
print(Car.get_car_count())  # 输出: 1
静态方法

静态方法是使用 @staticmethod 装饰器声明的方法,它与类和实例没有直接的关系,可以在类内部定义的独立函数。静态方法不接受类或实例作为第一个参数,因此它没有访问类属性或实例属性的能力。静态方法主要有以下特点:

  • 静态方法通常与类相关联,但不访问类属性或实例属性。
  • 可以被类名直接调用,也可以被实例调用,但不会接收类或实例作为参数。
  • 通常用于实现与类相关但不依赖于类实例或类属性的功能。

示例:

class MathUtils:@staticmethoddef add(x, y):return x + y@staticmethoddef multiply(x, y):return x * y# 使用静态方法
print(MathUtils.add(3, 5))  # 输出: 8
print(MathUtils.multiply(3, 5))  # 输出: 15
区别和用途
  • 参数:类方法的第一个参数是 cls,可以访问类属性;静态方法没有特殊的第一个参数,不能访问类属性或实例属性。
  • 访问方式:类方法可以通过类名或实例调用;静态方法可以通过类名或实例调用。
  • 用途:类方法通常用于修改类属性或返回类的实例;静态方法通常用于实现通用的功能函数,与类和实例无关。

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

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

相关文章

批量下载手机中APP程序中文件

需求 利用 adb pull 下载手机中app的某目录 adb pull 命令本身不支持直接下载整个目录(文件夹)及其所有子目录和文件作为一个单一的操作。但是,可以通过一些方法来间接实现这一目的。 方法 1. 首先将要下载的目录进行 tar 打包 # 在 And…

Python面试题:Python 中的 `property` 函数有什么用?

在 Python 中,property 函数用于创建和管理类中的属性。它允许你将方法转换为属性,这样你可以像访问变量一样访问这些方法。这对于控制属性的访问和修改非常有用,因为它允许你在属性访问时执行额外的逻辑(如验证或计算&#xff09…

光通信领域常见的会议和期刊总结

在高速光通信小组待了一年,对我们领域主要的会议和期刊也有了一定的了解,所以总结一下我们可以投的期刊或会议有哪些。会议一般有OFC、ECOC、CLEO、OECC、ACP等,期刊则有OE、OL、PTL、JLT、PJ、AO、JOSA等,下面简单介绍一下。 先…

【atcoder】习题——位元枚举

题意:求i&M的popcount的和,i属于0……N 主要思路还是变加为乘。 举个例子N22,即10110 假设M的第3位是1,分析N中: 00110 00111 00100 00101 发现其实等价于 0010 0011 0000 0001 也就是左边第4位和第5…

算法学习笔记(8.1)-动态规划入门

目录 问题特性: 最优子结构: 代码示例:(动态规划最优子结构) 上述最小代价爬楼梯的运行过程: 代码示例: 无后效性: 解析: 具体过程图示如下: 具体的…

如何为IP申请SSL证书

目录 以下是如何轻松为IP地址申请SSL证书的详细步骤: 申请IP证书的基本条件: 申请IP SSL证书的方式: 确保网络通信安全的核心要素之一,是有效利用SSL证书来加密数据传输,特别是对于那些直接通过IP地址访问的资源。I…

使用 Azure DevOps Pipelines 生成 .NET Core WebJob 控制台应用 CI/CD

Web 应用程序通常需要作为后台任务运行的进程,并在特定时间间隔进行计划或在事件中触发。它们不需要花哨的 IO 接口,因为重点是过程而不是输出。Azure WebJobs 提供了出色的支持,通常在云环境中通过 Web 控制台应用程序来实现此目的。WebJob …

企业数字化转型中的低代码开发平台应用:释放创新潜能

随着信息技术的飞速发展,企业数字化转型已成为行业趋势。在这场转型浪潮中,低代码开发平台以其独特的优势,成为众多企业实现快速迭代、高效创新的得力助手。本文将深入探讨低代码开发平台在企业数字化转型中的应用,以及如何帮助企…

Mac平台虚拟机 Parallels Desktop v19.4.1,支持M1/M2/M3芯片组

Parallels Desktop for Mac是功能强大灵活度高的虚拟化方案,无需重启即可在同一台电脑上随时访问Windows和Mac两个系统上的众多应用程序。从仅限于PC的游戏到生产力软件,Parallels Desktop都能帮您实现便捷使用。Parallels Desktop 是一款专业的Mac虚拟机…

Docker搭建kafka+zookeeper以及Springboot集成kafka快速入门

参考文章 【Docker安装部署KafkaZookeeper详细教程】_linux arm docker安装kafka-CSDN博客 Docker搭建kafkazookeeper 打开我们的docker的镜像源配置 vim /etc/docker/daemon.json 配置 { "registry-mirrors": ["https://widlhm9p.mirror.aliyuncs.com"…

vue父子组件通信实现模糊搜索功能

我遇到的问题: 我的搜索框在父页面,静态数据都在子页面。怎么实现模糊查询数据? 昨天的尝试:先把搜索的内容数据存到session里,然后从session里拿, 结果:存是存进去了,却拿不到。应…

Django学习收尾

启动项目命令 python manage.py runserver 文件上传功能实现 title "Form上传"if request.method "GET":form UpForm()return render(request, upload_form.html, {"form": form, "title": title})form UpForm(datarequest.POS…

Java对象创建究竟是在栈上还是堆上??

在 Java 中,对象的创建通常情况下是在堆上。 基本数据类型(如 byte、short、int、long、float、double、char)在方法内声明时,其值会存储在栈上。除了基本数据类型之外的所有对象,都是由 Java 虚拟机(JVM&…

python入门基础知识·二

""" # Python介绍 # Python注释 # 单行注释: # # 多行注释: r """""" # Python输出和输入 # print: 输出 # input: 输入 ①会让程序暂停,②得到的是字符串内容 int(&…

Linux Mac 安装Higress 平替 Spring Cloud Gateway

Linux Mac 安装Higress 平替 Spring Cloud Gateway Higress是什么?传统网关分类Higress定位下载安装包执行安装命令执行脚本 安装成功打开管理界面使用方法configure.shreset.shstartup.shshutdown.shstatus.shlogs.sh Higress官网 Higress是什么? Higress是基于阿里内部的…

Vue指令详解与实操运用 - 编程魔法

在Vue.js的世界里,指令就像是一位魔法师,它们能够赋予HTML元素以生命,让网页与用户互动起来。今天,我们就来揭开这些指令的神秘面纱,看看它们是如何在我们的日常开发中发挥作用的。 1. v-text 和 v-html - 文字与内容的…

思考:Java内存模型和硬件内存模型

前言 前一阵在看volatile的原理,看到内存屏障和缓存一致性,发现再往底层挖就挖到了硬件和Java内存模型。这一块是自己似懂非懂的知识区,我一般称之为知识混沌区。因此整理这一篇文章。 什么是内存模型(Memory Model)…

CentOS6用文件配置IP模板

CentOS6用文件配置IP模板 到 CentOS6.9 , 默认还不能用 systemctl , 能用 service chkconfig sshd on 对应 systemctl enable sshd 启用,开机启动该服务 ### chkconfig sshd on 对应 systemctl enable sshd 启用,开机启动该服务 sudo chkconfig sshd onservice sshd start …

未羽研发测试管理平台

突然有一些觉悟,程序猿不能只会吭哧吭哧的低头做事,应该学会怎么去展示自己,怎么去宣传自己,怎么把自己想做的事表述清楚。 于是,这两天一直在整理自己的作品,也为接下来的找工作多做点准备。接下来…

LT7911UX 国产原装 一拖三 edp 转LVDS 可旋转 可缩放

2.一般说明 该LT7911UX是一种高性能Type-C/DP1.4a到MIPI或LVDS芯片的VR/显示应用。HDCP RX作为HDCP转发器的上游,可以与其他芯片的HDCP TX配合实现转发器功能。 对于DP1.4a输入,LT7911UX可配置为1/2/4通道。自适应均衡使其适用于长电缆应用,最…