【Python进阶】 类的系统知识总结 | 特殊变量方法 单双下划线、继承、多态、装饰器

之前在C++中学过一些类与对象的知识,Python也同样是面向对象的,因而也有类与对象

浅浅总结一下

总结Python中关于类的知识

文章目录

  • 1 类的基本定义和访问
  • 2 特殊变量(属性/方法)
    • 2.1 双下划线开头结尾——特殊方法
      • 2.1.1 初始化方法\__init__
      • 2.1.2 字符输出方法\__str__
      • 2.1.3 调用方法\__call__
      • 2.1.4 删除释放方法\__init__
    • 2.2 双下滑线开头——私有属性和方法
    • 2.3 类变量和实例变量
  • 3 继承
  • 4 多态
    • 4.1 鸭子类型 (Duck Typing)
    • 3.2 继承和方法重写
  • 5 装饰器python

1 类的基本定义和访问

类的定义

  • 使用 class 关键字定义类。
  • 类名通常采用首字母大写的驼峰命名法。
class MyClass:pass

类内有属性方法(方法即函数)

  • 类可以拥有属性,这些属性是类的一部分,可以是数据。

  • 类可以定义方法,这些方法在类的对象上进行操作。

  • 方法通常通过 self 参数访问对象的属性。

2 特殊变量(属性/方法)

2.1 双下划线开头结尾——特殊方法

2.1.1 初始化方法_init_

  • __init__ 方法是类的构造器,用于创建对象时初始化对象。
  • 它的第一个参数总是 self,代表当前实例。
class Person:def __init__(self, name, age):self.name = nameself.age = age

2.1.2 字符输出方法_str_

  • 定义了当使用 print() 函数或 str() 函数将实例转换为字符串时,返回的字符串表示形式。
  • 目的是提供人类可读的字符串输出。

例子:

class Person:def __init__(self, name, age):self.name = nameself.age = agedef __str__(self):return f"Person(name={self.name}, age={self.age})"p = Person("Alice", 30)
print(p)  # 输出: Person(name=Alice, age=30)

2.1.3 调用方法_call_

  • 定义了当实例像函数一样被调用时 (例如 instance()) 所执行的操作。
  • 可以用来实现函数对象、装饰器等功能。

例子:

class Counter:def __init__(self):self.count = 0def __call__(self):self.count += 1return self.countcounter = Counter()
print(counter())  # 输出: 1
print(counter())  # 输出: 2

2.1.4 删除释放方法_init_

  • 定义了当实例被垃圾回收时执行的操作,通常用于释放资源。
  • 由于垃圾回收机制的复杂性,不建议过度依赖 del 方法。

例子:

class FileManager:def __init__(self, filename):self.file = open(filename, 'w')def __del__(self):self.file.close()print("File closed")fm = FileManager("temp.txt")
del fm  # 输出: File closed

2.2 双下滑线开头——私有属性和方法

使用双下划线 __ 前缀定义私有属性或方法,如 self.__private_var

2.3 类变量和实例变量

Python类变量和实例变量的区别

在Python中,类变量和实例变量是两种不同的变量类型,它们在定义位置、访问方式和生命周期方面存在差异:

1. 定义位置:

  • 类变量: 在类内部,但在任何方法之外定义。它们由所有该类的实例共享。
  • 实例变量: 在类的方法内部,使用 self 关键字定义。每个实例都有自己的一组实例变量。

2. 访问方式:

  • 类变量: 可以通过类名或实例名访问。
  • 实例变量: 只能通过实例名访问。

3. 生命周期:

  • 类变量: 在类定义时创建,并在程序结束时销毁。
  • 实例变量: 在实例创建时创建,并在实例销毁时销毁。
class Dog:# 类变量species = "Canis familiaris"def __init__(self, name, age):# 实例变量self.name = nameself.age = age# 访问类变量
print(Dog.species)  # 输出: Canis familiaris# 创建实例
buddy = Dog("Buddy", 3)
sparky = Dog("Sparky", 5)# 访问实例变量
print(buddy.name)  # 输出: Buddy
print(sparky.age)  # 输出: 5# 修改实例变量不会影响其他实例
buddy.age = 4
print(sparky.age)  # 输出: 5 (sparky的age不受影响)# 修改类变量会影响所有实例
Dog.species = "Canis lupus familiaris"
print(buddy.species)  # 输出: Canis lupus familiaris
print(sparky.species)  # 输出: Canis lupus familiaris

3 继承

  • 类可以继承其他类的属性和方法,使用 class ChildClass(ParentClass)
class Animal:passclass Dog(Animal):pass

4 多态

多态是面向对象编程的重要概念之一,它指的是同一个操作作用于不同的对象时,可以产生不同的行为。

Python中的多态主要体现在以下两个方面:

4.1 鸭子类型 (Duck Typing)

  • Python崇尚“鸭子类型”,即不在乎对象的类型,只在乎对象的行为。
  • 如果一个对象“走路像鸭子,叫声像鸭子”,那么它就可以被视为鸭子。
  • 这意味着,只要对象实现了所需的方法,就可以将其用于任何期望该方法的地方,而无需考虑对象的具体类型。

例子:

class Dog:def make_sound(self):print("Woof!")class Cat:def make_sound(self):print("Meow!")def animal_sound(animal):animal.make_sound()animals = [Dog(), Cat()]
for animal in animals:animal_sound(animal)  # 无论是Dog还是Cat,都能调用make_sound方法

3.2 继承和方法重写

  • 通过继承,子类可以继承父类的方法,并可以根据需要重写这些方法,实现不同的行为。
  • 这种方式也体现了多态,因为同一个方法调用,根据对象类型的不同,执行的是不同的代码。

例子:

class Animal:def speak(self):print("Animal sound")class Dog(Animal):def speak(self):print("Woof!")class Cat(Animal):def speak(self):print("Meow!")animals = [Animal(), Dog(), Cat()]
for animal in animals:animal.speak()  # 不同的动物发出不同的声音

多态的优点:

  • 提高代码灵活性: 无需关注对象的具体类型,可以编写更通用的代码。
  • 增强代码可扩展性: 更容易添加新的子类,而无需修改现有代码。
  • 简化代码维护: 代码更加简洁,易于理解和维护。

5 装饰器python

装饰器本身是很大一块的知识

这些装饰器用于定义类中的特殊方法,它们在参数和行为方面有所不同

1. @staticmethod

  • 定义静态方法。
  • 静态方法不接收 self 或 cls 参数,它们与类本身无关,更像是普通的函数,只是碰巧在类中定义。
  • 主要用于组织代码,将与类相关的函数归类到一起。

例子:

class MathUtils:@staticmethoddef add(x, y):return x + yresult = MathUtils.add(2, 3)  # 无需创建实例,直接通过类名调用
print(result)  # 输出: 5

2. @classmethod

  • 定义类方法。
  • 类方法接收 cls 参数,它代表类本身,而不是类的实例。
  • 可以访问类变量和类方法,但不能访问实例变量。
  • 常用于创建工厂方法,根据不同的参数创建不同的类实例。

例子:

class Person:def __init__(self, name, age):self.name = nameself.age = age@classmethoddef from_birth_year(cls, name, birth_year):age = 2023 - birth_year  # 假设当前年份为2023return cls(name, age)person1 = Person("Alice", 30)
person2 = Person.from_birth_year("Bob", 1990)
print(person2.age)  # 输出: 33

3. @property

  • 定义属性。
  • 将方法转换为属性,使得访问属性就像访问普通变量一样,但实际上是在调用方法。
  • 可以用于添加属性的 getter、setter 和 deleter 方法,实现对属性访问的控制和验证。

例子:

class Celsius:def __init__(self, temperature):self._temperature = temperature@propertydef temperature(self):return self._temperature@temperature.setterdef temperature(self, value):if value < -273.15:raise ValueError("Temperature below -273.15 is not possible")self._temperature = valuec = Celsius(0)
print(c.temperature)  # 输出: 0
c.temperature = 37  # 自动调用setter方法
print(c.temperature)  # 输出: 37

总结:

  • @staticmethod: 定义静态方法,与类本身无关,类似于普通函数。
  • @classmethod: 定义类方法,接收类作为参数,常用于工厂方法。
  • @property: 定义属性,控制属性的访问方式,并可以添加 getter、setter 和 deleter 方法。

使用这些装饰器可以使代码更清晰、简洁,并实现更高级的功能。

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

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

相关文章

Git与GitHub交互

注册 https://github.com/ 本地库与远程库交互方式 创建本地库并提交文件 创建远程库 在本地库创建远程库地址别名 查看现有远程库地址的别名 git remote -v 创建远程库地址别名 git remote add [别名] [远程地址] 远程路地址位置 示例 成员1推送 git push [别名] [分支…

web server apache tomcat11-34-Ahead of Time compilation support

前言 整理这个官方翻译的系列&#xff0c;原因是网上大部分的 tomcat 版本比较旧&#xff0c;此版本为 v11 最新的版本。 开源项目 从零手写实现 tomcat minicat 别称【嗅虎】心有猛虎&#xff0c;轻嗅蔷薇。 系列文章 web server apache tomcat11-01-官方文档入门介绍 web…

文心一言 VS 讯飞星火 VS chatgpt (254)-- 算法导论18.2 7题

七、假设磁盘硬件允许我们任意选择磁盘页面的大小&#xff0c;但读取磁盘页面的时间是 abt 其中 a 和 b 为规定的常数&#xff0c;t 为确定磁盘页大小后的 B 树的最小度数。请描述如何选择 t 以(近似地)最小化 B 树的查找时间。对 a5ms 和 b10ms &#xff0c;请给出 t 的一个最…

超越视觉极限:深度学习图像超分辨率算法清单【第四部分】

超越视觉极限&#xff1a;深度学习图像超分辨率算法清单【第四部分】 简介2019年 - SAN (Second-Order Attention Network)2019年 - IMDN (Information Multi-Distillation Network)2020年 - SwinIR (Swin Transformer for Image Restoration)2021年 - Real-ESRGAN (Real-World…

使用图网络和视频嵌入预测物理场

文章目录 一、说明二、为什么要预测&#xff1f;三、流体动力学模拟的可视化四、DeepMind神经网络建模五、图形编码六、图形处理器七、图形解码器八、具有不同弹簧常数的轨迹可视化九、预测的物理编码和推出轨迹 一、说明 这是一篇国外流体力学专家在可视化流体物理属性的设计…

大数据技术概述_2.大数据面临的5个方面的挑战

1. 大数据面临着5个主要问题 2012年冬季&#xff0c;来自IBM、微软、谷歌、HP、MIT、斯坦福、加州大学伯克利分校、UIUC等产业界和学术界的数据库领域专家通过在线的方式共同发布了一个关于大数据的白皮书。该白皮书首先指出大数据面临着5个主要问题&#xff0c;分别是异构性&a…

环境搭建 docker-compose

systemctl restart network docker-compose 单独执行一个文件 docker-compose -f version: 3services:nacos-standalone:image: nacos/nacos-server:v2.3.1 container_name: nacos-standaloneenvironment:- PREFER_HOST_MODEhostname- MODEstandalone- NACOS_AUTH_IDENTITY_…

阿里云CentOS 7.9 64位 Liunx 安装redis

具体的步骤如下&#xff1a; 添加 EPEL 仓库&#xff0c;因为 Redis 在标准的 CentOS 仓库中不可用&#xff1a; sudo yum install epel-release安装 Redis&#xff1a; sudo yum install redis启动 Redis 服务&#xff1a; sudo systemctl start redis如果你想让 Redis 在…

使用Vue3开发项目,搭建Vue cli3项目步骤

1.打开cmd &#xff0c;输入 vue create neoai遇到这样的问题 则需要升级一下电脑上 Vue Cli版本哈 升级完成之后 再次输入命令&#xff0c;创建vue3项目 vue create neoai安装完成后&#xff0c;输入 npm run serve 就可以运行项目啦~ 页面运行效果

【LLM 论文】OpenAI 基于对比学习微调 LLM 得到嵌入模型

论文&#xff1a;Text and Code Embeddings by Contrastive Pre-Training ⭐⭐⭐⭐ OpenAI 一、论文速读 这篇论文基于大型生成式 LLM 通过对比学习来微调得到一个高质量的 text 和 code 的 embedding 模型。 训练数据的格式&#xff1a;是一堆 ( x i , y i ) (x_i, y_i) (x…

上传文件至linux服务器失败

目录 前言异常排查使用df -h命令查看磁盘使用情况使用du -h --max-depth1命令查找占用空间最大的文件夹 原因解决补充&#xff1a;删除文件后&#xff0c;磁盘空间无法得到释放 前言 使用XFTP工具上传文件至CentOS服务器失败 异常 排查 使用df -h命令查看磁盘使用情况 发现磁盘…

C语言:初学者和专家的分水岭

C语言&#xff1a;初学者和专家的分水岭 C语言作为一门古老而强大的编程语言&#xff0c;被认为是菜鸟和大神之间的分水岭。在编程领域&#xff0c;C语言不仅是初学者学习的重要起点&#xff0c;也是专家深入研究和高级编程的基础。本文将通过具体实例来说明C语言在不同级别开发…

【leetcode】链表排序题目总结

21. 合并两个有序链表 递归法 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : va…

怎么ai解答问题?这三个方法都可以

怎么ai解答问题&#xff1f;在数字化飞速发展的今天&#xff0c;人工智能&#xff08;AI&#xff09;技术已经渗透到我们生活的方方面面&#xff0c;尤其是在解答问题方面&#xff0c;AI展现出了令人瞩目的能力。那么&#xff0c;哪些软件可以利用AI技术解答问题呢&#xff1f;…

使用curl命令查看服务器端口开放情况

目录 1.ssh端口 22 2.mysql数据库端口 3306 3.web应用端口 &#xff08;Jellyfin 8082&#xff09; &#xff08;wordpress 8088&#xff09; &#xff08;tomcat 8080&#xff09; 4.不存在的端口 5.被防火墙阻挡的端口 1.ssh端口 22 curl -v 10.10.10.205:22 curl…

leetcode_47.全排列 II

47. 全排列 II 题目描述&#xff1a;给定一个可包含重复数字的序列 nums &#xff0c;按任意顺序 返回所有不重复的全排列。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,2] 输出&#xff1a; [[1,1,2],[1,2,1],[2,1,1]]示例 2&#xff1a; 输入&#xff1a;nums [1,2,3] …

了解你的构建:发布经理构建难点应对指南

在如今的计算机行业&#xff0c;发布经理的工作任重而道远。一方面他们必须紧跟日益攀升的行业标准&#xff0c;发布速度的极限不断突破&#xff0c;现在要求的速度在过去是远远无法想象的。另一方面&#xff0c;质量的门槛也在不断抬高。 我并非诟病软件更新换代过于迅速频繁…

揭秘数据可视化:五款利器助力决策

在当今这个数据驱动的时代&#xff0c;数据可视化已成为企业决策、数据分析不可或缺的一部分。通过直观、生动的图形、图像&#xff0c;数据可视化能够更快速、更准确地传达信息&#xff0c;帮助企业洞察数据背后的价值。本文将为您介绍几款优秀的数据可视化工具。 一、山海鲸…

【C++ 所有STL容器简介】

【C 所有STL容器简介】 1. vector2. list3. deque4. set / multiset5. map / multimap6. unordered_set / unordered_multiset7. unordered_map / unordered_multimap8. stack9. queue10. priority_queue C 标准模板库&#xff08;STL&#xff09;提供了一系列常用的容器&#…

Backblaze发布2024 Q1硬盘故障质量报告-1

作为一家在2021年在美国纳斯达克上市的云端备份公司&#xff0c;Backblaze一直保持着对外定期发布HDD和SSD的故障率稳定性质量报告&#xff0c;给大家提供了一份真实应用场景下的稳定性分析参考数据。 截至2024年第一季度末&#xff0c;Backblaze在其全球数据中心的云存储服务器…