【Python单点知识】类成员汇总讲解——包含类方法、静态方法、私有成员说明

文章目录

      • 0. 前言
      • 1. 属性(Attributes)
        • 1.1 类属性(Class Attributes)
        • 1.2 实例属性(Instance Attributes)
      • 2. 方法(Methods)
        • 2.1 实例方法(Instance Methods)
        • 2.2 类方法(Class Methods)
        • 2.3 静态方法(Static Methods)
        • 2.4 魔术方法(Magic Methods)
      • 3. 私有成员(Private Members)
        • 3.1 双下划线前缀 (`__`)
        • 3.2 单下划线前缀 (`_`)

0. 前言

按照国际惯例,首先声明:本文只是我自己学习的理解,虽然参考了他人的宝贵见解及成果,但是内容可能存在不准确的地方。如果发现文中错误,希望批评指正,共同进步。

本文通过实例介绍Python中的类的成员,包括各种常用和不太常用的属性、方法等。

1. 属性(Attributes)

1.1 类属性(Class Attributes)

在类级别定义的变量,所有类的实例共享同一个类变量的存储空间,修改其中一个实例的类变量会影响其他所有实例。

class MyClass:class_var = "This is a class variable"# 创建实例
instance1 = MyClass()
instance2 = MyClass()
print(instance1.class_var)  # 输出: This is a class variable
print(instance2.class_var)  # 输出相同的值# 改变类变量会影响到所有实例
MyClass.class_var = "New value"
print(instance1.class_var)  # 输出: New value
1.2 实例属性(Instance Attributes)

在类的__init__方法或其他实例方法中定义的变量,每个实例都有自己独立的一份存储空间,互不影响。

class Person:def __init__(self, name):self.name = nameperson1 = Person("Alice")
person2 = Person("Bob")
print(person1.name)  # 输出: Alice
print(person2.name)  # 输出: Bob

2. 方法(Methods)

2.1 实例方法(Instance Methods)

这些方法通常用来操作或计算基于实例变量的值,并且总是接收一个隐含的self参数,指向调用方法的实例本身。

class Person:def __init__(self, name):self.name = namedef introduce_self(self):print(f"My name is {self.name}")p = Person("Charlie")
p.introduce_self()  # 输出: My name is Charlie
2.2 类方法(Class Methods)

类方法是定义在类内部,但与类自身相关而非特定实例相关的一种特殊方法。类方法的主要特征在于其使用了@classmethod装饰器,并且其第一个参数通常是cls(虽然也可以使用其他名称,但cls是约定俗成的),代表的是调用该方法的类对象本身。类方法能够直接通过类来调用,无需事先创建类的实例

当某个操作依赖于类的属性或行为,而不是特定实例的状态时,使用类方法更为合适。它允许直接操作类层次上的数据或行为,而不需要通过实例来间接访问。

class MyClass:@classmethoddef my_class_method(cls, arg):return f"Called by {cls.__name__} with arg: {arg}"# 直接通过类调用
result = MyClass.my_class_method("hello")
print(result)  # 输出: Called by MyClass with arg: hello# 通过实例调用
instance = MyClass()
result = instance.my_class_method("world")
print(result)  # 输出: Called by MyClass with arg: world
2.3 静态方法(Static Methods)

使用@staticmethod装饰器标记的方法,不接受selfcls作为参数,它们与类或实例无关,只是简单地将函数组织到类的命名空间中。

下面是一个使用Python静态方法的实例:

class MathUtils:"""一个包含数学实用方法的类,其中包含一个静态方法。"""@staticmethoddef gcd(a, b):input_a = ainput_b = bwhile b:a, b = b, a % bprint(f"The GCD of {input_a} and {input_b} is {a}.")return a# 其他类方法和实例方法可以在这里定义...# 使用静态方法的示例
result = MathUtils.gcd(9, 18)   #输出 “The GCD of 9 and 18 is 9.”# # 也可以通过类的实例调用静态方法,尽管这通常并不推荐!因为静态方法与实例无关
math_utils_instance = MathUtils()
another_result = math_utils_instance.gcd(24,12)  #输出“The GCD of 24 and 12 is 12.”

在这个例子中,我们定义了一个名为MathUtils的类,它包含一个静态方法gcd:基于辗转相除法计算两个整数的最大公约数。静态方法使用@staticmethod装饰器进行标识。由于gcd方法与类的实例无关,不需要访问或修改实例状态,因此适合用静态方法实现。

调用静态方法时,可以直接通过类名MathUtils.gcd()来调用,无需创建类的实例。尽管如此,静态方法也可以通过类的实例来调用,如math_utils_instance.gcd(),但这并不是静态方法设计意图的优势所在,且可能会使代码的意图不够清晰。通常,最好直接通过类名调用静态方法,以明确表明该方法与实例无关。

2.4 魔术方法(Magic Methods)

Python中自带的前后都以双下划线__装饰的方法为魔术方法,形如__init__()。此前已经专门介绍过,不再重复:Python中魔术方法汇总

3. 私有成员(Private Members)

Python 中的私有成员是指在类定义中,通过特殊命名约定标记为仅对类内部可见的属性(变量)和方法。这些成员旨在限制外部访问和修改,以增强代码的封装性和数据安全性。Python 使用两种常见的命名约定来实现私有性:

3.1 双下划线前缀 (__)

在 Python 中,将属性或方法名前缀为两个下划线 (__) 是最常用的标记私有成员的方式。当 Python 解释器遇到这样的名字时,它会执行一种称为 名称修饰(name mangling) 的过程,即将原始名字更改为一个类似 _ClassName__private_name 的形式。这种修改后的名字在外部不易被直接访问,从而实现了某种程度的私有性。

例如:

class MyClass:def __init__(self):self.__private_attribute = "This is private"def __private_method(self):print("This is a private method")my_instance = MyClass()# 直接尝试访问或调用私有成员会失败
try:print(my_instance.__private_attribute)
except AttributeError as e:print(e)  # 输出:'MyClass' object has no attribute '__private_attribute'try:my_instance.__private_method()
except AttributeError as e:print(e)  # 输出:'MyClass' object has no attribute '__private_method'

虽然名称修饰使得外部代码难以直接访问,但实际上这些私有成员并未被完全封锁。通过知晓名称修饰规则,外部代码仍可通过修改后的名字访问或调用私有成员,但这被认为是不良编程实践,因为它破坏了类的封装性

# 不推荐这样做!绕过名称修饰访问私有成员
try:print(my_instance._MyClass__private_attribute)  #输出"This is private"print(my_instance._MyClass__private_method())  #输出"This is a private method"
except AttributeError as e:print(e)
3.2 单下划线前缀 (_)

有时也会看到单下划线前缀 (_) 用于标记成员,但这并不严格实现私有性,而是作为一种约定,提示其他开发者这是一个内部使用的、不应被外部代码直接访问的属性或方法。这种约定在 Python 社区中被广泛接受,但解释器并不会阻止外部访问:

class MyClass:def __init__(self):self._internal_attribute = "This is an internal attribute"def _internal_method(self):print("This is an internal method")my_instance = MyClass()# 单下划线前缀的成员可以被外部访问,但不推荐这样做
print(my_instance._internal_attribute)
my_instance._internal_method()

总结一下,Python 中的私有成员主要是指通过双下划线前缀 (__) 标记的属性和方法,它们通过名称修饰提供了一定程度的封装性。虽然理论上可以通过名称修饰规则从外部访问这些成员,但这种做法违背了封装原则,应尽量避免。单下划线前缀的成员则更多是一种编码约定,用于指示它们是内部使用的,而不是真正的私有成员。在实践中,应尊重这些约定以维护代码的整洁性和可维护性。

以上就是Python中的类成员汇总说明。

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

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

相关文章

算法实战:亲自写红黑树之三 算法详解

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 此文承接:算法实战…

动态规划:力扣LCR 188. 买卖芯片的最佳时机

题目 数组 prices 记录了某芯片近期的交易价格,其中 prices[i] 表示的 i 天该芯片的价格。你只能选择 某一天 买入芯片,并选择在 未来的某一个不同的日子 卖出该芯片。请设计一个算法计算并返回你从这笔交易中能获取的最大利润。 如果你不能获取任何利…

【软考高项】四十四、高级项目管理

一、项目集管理 相关角色 项目集发起人、项目集指导委员会、项目集经理、其他影响项目集的干系人项目集管理绩效域 项目集战略一致性、项目集效益管理、项目集干系人参与、项目集治理和项目集生命周期管理 二、项目组合管理 项目组合经理角色 项目组合管理原…

Imitation Learning学习记录(理论例程)

前言 最近还是衔接着之前的学习记录,这次打算开始学习模仿学习的相关原理,参考的开源资料为 TeaPearce/Counter-Strike_Behavioural_Cloning: IEEE CoG & NeurIPS workshop paper ‘Counter-Strike Deathmatch with Large-Scale Behavioural Clonin…

java项目之汽车资讯网站源码(springboot+mysql+vue)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的汽车资讯网站。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 汽车资讯网站的主要使用者管…

Vue从入门到实战Day04

一、组件的三大组成部分(结构/样式/逻辑) 1. scoped样式冲突 默认情况:写在组件中的样式会全局生效 -> 因此很容易造成多个组件之间的样式冲突问题。 1. 全局样式:默认组件中的样式会作用到全局 2. 局部样式:可以…

LeetCode 138. 随机链表的复制

目录 1.原题链接: 2.结点拆分: 代码实现: 3.提交结果: 4.读书分享: 1.原题链接: 138. 随机链表的复制 2.结点拆分: ①.拷贝各个结点,连接在原结点后面; ②.处…

【MySQL】基本操作

欢迎来到Cefler的博客😁 🕌博客主页:折纸花满衣 🏠个人专栏:MySQL 目录 👉🏻创建和删除数据库👉🏻数据库编码集和数据库校验集校验规则对数据库的影响 👉&…

【1 bit 翻转+无任何保护】MidnightsunQuals 2021 BroHammer

前言 又是一道非常有意思的题目,其实笔者很喜欢这种跟页表、特权级等相关的题目(:虽然大多都无法独立做出来,但是通过这些题目可以学到很多的东西 题目分析 内核版本:v4.17.0smap/smep/kpti/kaslr 全关 题目给了源…

laravel8 导入 excel常见问题

上传xls 或 xlsx 文件后,文件解析为 zip 格式,输入正常情况,不影响解析 里面的内容 遇到解析内容,解析为空的情况,可能是 因为excel 存在多个 Sheet1 造成,服务器不能解析一个 Sheet1 的情况&#xff0…

智慧停车场管理系统主要组成

智慧泊车场办理体系,完成了泊车办理过程中的车辆类型分类、出场时的车牌辨认、行进路线的引导、空余车位诱导,以及准备离场前的反向寻车和方便缴费等全部环节。这六个流程中,泊车场对车辆的办理,进步了泊车场的运行效率&#xff0…

【网络】为什么TCP需要四次挥手?

在网络通信中,TCP(传输控制协议)是一种可靠的、面向连接的协议,它在数据传输过程中保证了数据的可靠性和顺序性。而TCP的连接建立过程只需要三次握手,但是TCP的挥手过程却需要四次挥手,这是为什么呢&#x…

数据分享—中国土壤有机质数据

土壤有机质数据是进行区域土地资源评价,开展自然地理研究常使用的数据,本期推文主要分享全国土壤有机质数据集。梧桐君会不定期分享地理信息数据,欢迎大家长期订阅。 数据来源 “万物土中生”,小编今天要分享的中国土壤有机质数…

Tomcat 内核详解 - Web服务器机制

详细介绍 Apache Tomcat 是一个开源的Web服务器和Servlet容器,它实现了Java Servlet、JavaServer Pages (JSP) 和WebSocket规范。Tomcat的核心设计围绕着几个关键组件,它们共同构成了处理HTTP请求、管理Web应用部署和执行Servlet逻辑的基础架构。 Apac…

牛客NC404 最接近的K个元素【中等 二分查找+双指针 Java/Go/PHP】

题目 题目链接: https://www.nowcoder.com/practice/b4d7edc45759453e9bc8ab71f0888e0f 知识点 二分查找;找到第一个大于等于x的数的位置idx;然后从idx开始往两边扩展Java代码 import java.util.*;public class Solution {/*** 代码中的类名、方法名、…

小程序组件间传值

1、属性绑定&#xff08;Props&#xff09;: 父组件通过在子组件标签上设置属性的方式向子组件传值。 子组件通过properties定义接收的属性 父组件&#xff1a; wxml <child-component title"{{parentData}}"></child-component>子组件&#xff1a; js p…

可观测性监控

1 目的 常见的监控&#xff0c;主要是以收集数据以识别异常系统效应为主&#xff0c;多是单个服务&#xff0c;相互独立的状态。 可观测性&#xff0c;希望调查异常系统效应的根本原因&#xff0c;能够把多个服务、中间件、容器等串联起来&#xff0c;同时柔和metrics、log、…

前端怎么用 EventSource? EventSource怎么配置请求头及加参数? EventSourcePolyfill使用方法

EventSource EventSource 接口是 web 内容与服务器发送事件通信的接口。 一个 EventSource 实例会对 HTTP 服务器开启一个持久化的连接&#xff0c;以 text/event-stream 格式发送事件&#xff0c;此连接会一直保持开启直到通过调用 EventSource.close() 关闭。 EventSource…

常见的推荐系统框架

1&#xff09;Microsoft Recommender&#xff1a; 该框架由微软开发&#xff0c;可以免费使用&#xff0c;主要提供了包括一般功能&#xff08;Common Utilities&#xff09;、大数据功能&#xff08;Dataset Utilities&#xff09;、评价功能&#xff08;Evaluation Utilitie…

将本地docker镜像以压缩包格式保存至其他路径、从本地的镜像压缩包中加载docker镜像

保存本地Docker镜像为压缩包至其他路径 你可以使用 docker save 命令结合输出重定向&#xff08; -o 选项&#xff09;来将本地Docker镜像保存为一个压缩包&#xff08;通常是tar格式&#xff09;并直接保存到指定的路径。以下是一个示例命令&#xff1a; docker save -o /pa…