【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 = name
        self.age = age

2.1.2 字符输出方法_str_

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

例子:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __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 = 0

    def __call__(self):
        self.count += 1
        return self.count

counter = 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 = name
        self.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:
    pass

class 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:
    @staticmethod
    def add(x, y):
        return x + y

result = MathUtils.add(2, 3)  # 无需创建实例,直接通过类名调用
print(result)  # 输出: 5

2. @classmethod

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

例子:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    @classmethod
    def from_birth_year(cls, name, birth_year):
        age = 2023 - birth_year  # 假设当前年份为2023
        return 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

    @property
    def temperature(self):
        return self._temperature

    @temperature.setter
    def temperature(self, value):
        if value < -273.15:
            raise ValueError("Temperature below -273.15 is not possible")
        self._temperature = value

c = Celsius(0)
print(c.temperature)  # 输出: 0
c.temperature = 37  # 自动调用setter方法
print(c.temperature)  # 输出: 37

总结:

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

给网站网页PHP页面设置密码访问代码

将MkEncrypt.php文件上传至你网站根目录下或者同级目录下。 MkEncrypt.php里面添加代码&#xff0c;再将调用代码添加到你需要加密的页进行调用 MkEncrypt(‘123456’);括号里面123456修改成你需要设置的密码。 密码正确才能进去页面&#xff0c;进入后会存下cookies值&…

项目经理【过程】概念

系列文章目录 【引论一】项目管理的意义 【引论二】项目管理的逻辑 【环境】概述 【环境】原则 【环境】任务 【环境】绩效 【人】概述 【人】原则 【人】任务 【人】绩效 【过程】概念 一、过程是什么 1.1 项目管理五大过程组 1.2 五大过程组之间的相互作用 1.3 项目阶段VS过…

《Linux运维总结:ARM架构CPU基于docker-compose一离线部署consul v1.18.1集群工具》

总结&#xff1a;整理不易&#xff0c;如果对你有帮助&#xff0c;可否点赞关注一下&#xff1f; 更多详细内容请参考&#xff1a;《Linux运维篇&#xff1a;Linux系统运维指南》 一、部署背景 由于业务系统的特殊性&#xff0c;我们需要面向不通的客户安装我们的业务系统&…

【SpringBoot】-- 监听容器事件、Bean的前后置事件

目录 一、ApplicationContextInitializer 使用 1、自定义类&#xff0c;实现ApplicationContextInitializer接口 2、在META-INF/spring.factories配置文件中配置自定义类 二、ApplicationListener 使用 1、自定义类&#xff0c;实现ApplicationListener接口 2、在META-…

tensorboard子目录运行

tensorboard默认在根目录运行&#xff0c;浏览器访问127.0.0.1:6006打开界面。 如果想在子目录运行&#xff0c;那么可以这么执行 tensorboard --logdir ./logs --path_prefix/app/asd 然后浏览器既可以通过 http://localhost:6006/app/asd/来访问。​​​​​​ 但这么做遇…

HADOOP之YARN详解

目录 一、YARN的简介 1.1 MapReduce 1.x 1.1.1 MapReduce 1.x的角色 1.2 YARN的介绍 1.3 YARN的设计思想 二 YARN的配置 1. mapred-site.xml 2. yarn-site.xml ​编辑 3. hadoop-env.sh 4. 分发到其他节点 5.YARN的服务启停 6. 任务测试 三 YARN的历史日志 1. 历…

JetBrains的多数据库管理和SQL工具DataGrip 2024.1版本在Windows/Linux系统的下载与安装配置

目录 前言一、DataGrip在Windows安装二、DataGrip在Linux安装三、Windows下使用配置四、Linux下使用配置总结 前言 ​ “ DataGrip是一款多数据库管理和SQL工具&#xff0c;适用于不同类型的数据库。它提供了丰富的功能和工具&#xff0c;可以帮助开发人员更高效地管理数据库、…

【Linux网络编程】4.TCP协议、select多路IO转换

目录 TCP协议 TCP通讯时序 三次握手 四次挥手 滑动窗口 测试代码1 测试结果 Address already in use解决方法 批量杀进程 测试代码2 测试结果 测试代码4 测试结果 TCP状态转换 主动发起连接请求端 主动关闭连接请求端 被动接收连接请求端 被动关闭连接请求端…

浅谈自己用过最好用的AI工具概括

个人最经常用的AI工具的其实是Copilot&#xff0c;但是也有别的一些最好用的AI工具&#xff0c;包括&#xff1a; OpenAI GPT-3&#xff1a;这是一个自然语言生成模型&#xff0c;具有强大的语言理解和生成能力。它可以用于各种任务&#xff0c;如文字生成、自动回复和文本摘要…

1984. 学生分数的最小差值C++

给你一个 下标从 0 开始 的整数数组 nums &#xff0c;其中 nums[i] 表示第 i 名学生的分数。另给你一个整数 k 。 从数组中选出任意 k 名学生的分数&#xff0c;使这 k 个分数间 最高分 和 最低分 的 差值 达到 最小化 。 返回可能的 最小差值 。 示例 1&#xff1a; 输入&…

台灯的十大品牌有哪些?十大护眼灯品牌推荐

相信细心的家长已经发现&#xff0c;自家孩子随着步入更高的年级&#xff0c;每天晚上学习的时间也越来越晚了&#xff0c;而这个过程中必然少不了一盏好的台灯&#xff01; 市场上有不少网红代言的护眼灯&#xff0c;虽然它们销售量高&#xff0c;但其实缺乏专业技术和安全保障…

大数据Scala教程从入门到精通第三篇:Scala和Java的关系

一&#xff1a;Scala和Java的关系 1&#xff1a;详解 一般来说&#xff0c;学 Scala的人&#xff0c;都会 Java&#xff0c;而 Scala 是基于 Java 的&#xff0c;因此我们需要将 Scala和 Java 以及 JVM 之间的关系搞清楚&#xff0c;否则学习 Scala 你会蒙圈 Scala可以使用SDK…

【算法】基础算法004之前缀和

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 前言 本篇文章为大家带来前缀和…

推荐一个gpt全能网站

进入后&#xff0c;里面是这样的 点开后&#xff0c;里面是这样的 你以为只有这些吗&#xff1f; 往下翻一翻&#xff0c;你会发现新大陆&#xff01;&#xff01; 在输入框的下面&#xff0c;有一个分类栏&#xff0c;鼠标移上去&#xff0c;下面就会给出一堆网站 光是gp…

(超简单)SpringBoot中简单用工厂模式来实现

简单讲述业务需求 业务需要根据不同的类型返回不同的用户列表&#xff0c;比如按角色查询用户列表、按机构查询用户列表&#xff0c;用户信息需要从数据库中查询&#xff0c;因为不同的类型查询的逻辑不相同&#xff0c;因此简单用工厂模式来设计一下&#xff1b; 首先新建一个…

为什么 ChatGPT 不火了?

不火了是有原因的&#xff0c;下面我来从大部分人拿到 ChatGPT 之后的两大痛点开始讲起&#xff1a; 很多朋友拿到 ChatGPT 后的第一个痛点就是&#xff1a;用的不好 你经常会感觉到 ChatGPT 回答的好空&#xff0c;没有太多参考价值。 而第二个痛点则是&#xff1a;无处去用…

数据结构复习/学习9--堆/堆实现/升降序建堆/top-k问题

一、堆与完全二叉树 1.堆的逻辑与物理结构 2.父节点与子节点的下标 3.大小根堆 二、堆的实现&#xff08;大根堆为例&#xff09; 注意事项总结&#xff1a; 注意堆中插入与删除数据的位置和方法与维持大根堆有序时的数据上下调整 三、堆排序 1.排升序建大堆效率高 注意事项…

Android 开机启动扫描SD卡apk流程源码分析

在开机的时候&#xff0c;装在SD卡的apk和装在系统盘的apk扫描过程不一样&#xff0c;系统盘apk在系统启动过程中扫描&#xff0c;而SD卡上的就不是&#xff0c;等系统启动好了才挂载、扫描&#xff0c;下面就说下SD扫描的流程&#xff1a; 在SystemServer启动MountService&am…

Golang | Leetcode Golang题解之第74题搜索二维矩阵

题目&#xff1a; 题解&#xff1a; func searchMatrix(matrix [][]int, target int) bool {m, n : len(matrix), len(matrix[0])i : sort.Search(m*n, func(i int) bool { return matrix[i/n][i%n] > target })return i < m*n && matrix[i/n][i%n] target }

【查找算法】之二分查找

一、算法介绍 二分查找&#xff0c;也称为折半查找&#xff0c;是一种在有序数组中查找特定元素的高效算法。对于包含 n 个元素的有序数组&#xff0c;二分查找的步骤如下&#xff1a; 确定搜索范围&#xff1a;首先&#xff0c;将要查找的元素与数组中间的元素进行比较。如果…
最新文章