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

本文主要是介绍【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中的类成员汇总说明。

这篇关于【Python单点知识】类成员汇总讲解——包含类方法、静态方法、私有成员说明的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/981772

相关文章

问题:第一次世界大战的起止时间是 #其他#学习方法#微信

问题:第一次世界大战的起止时间是 A.1913 ~1918 年 B.1913 ~1918 年 C.1914 ~1918 年 D.1914 ~1919 年 参考答案如图所示

[word] word设置上标快捷键 #学习方法#其他#媒体

word设置上标快捷键 办公中,少不了使用word,这个是大家必备的软件,今天给大家分享word设置上标快捷键,希望在办公中能帮到您! 1、添加上标 在录入一些公式,或者是化学产品时,需要添加上标内容,按下快捷键Ctrl+shift++就能将需要的内容设置为上标符号。 word设置上标快捷键的方法就是以上内容了,需要的小伙伴都可以试一试呢!

C++工程编译链接错误汇总VisualStudio

目录 一些小的知识点 make工具 可以使用windows下的事件查看器崩溃的地方 dumpbin工具查看dll是32位还是64位的 _MSC_VER .cc 和.cpp 【VC++目录中的包含目录】 vs 【C/C++常规中的附加包含目录】——头文件所在目录如何怎么添加,添加了以后搜索头文件就会到这些个路径下搜索了 include<> 和 include"" WinMain 和

大学湖北中医药大学法医学试题及答案,分享几个实用搜题和学习工具 #微信#学习方法#职场发展

今天分享拥有拍照搜题、文字搜题、语音搜题、多重搜题等搜题模式,可以快速查找问题解析,加深对题目答案的理解。 1.快练题 这是一个网站 找题的网站海量题库,在线搜题,快速刷题~为您提供百万优质题库,直接搜索题库名称,支持多种刷题模式:顺序练习、语音听题、本地搜题、顺序阅读、模拟考试、组卷考试、赶快下载吧! 2.彩虹搜题 这是个老公众号了 支持手写输入,截图搜题,详细步骤,解题必备

电脑不小心删除的文件怎么恢复?4个必备恢复方法!

“刚刚在对电脑里的某些垃圾文件进行清理时,我一不小心误删了比较重要的数据。这些误删的数据还有机会恢复吗?希望大家帮帮我,非常感谢!” 在这个数字化飞速发展的时代,电脑早已成为我们日常生活和工作中不可或缺的一部分。然而,就像生活中的小插曲一样,有时我们可能会在不经意间犯下一些小错误,比如不小心删除了重要的文件。 当那份文件消失在眼前,仿佛被时间吞噬,我们不禁会心生焦虑。但别担心,就像每个问题

Java面试题:通过实例说明内连接、左外连接和右外连接的区别

在 SQL 中,连接(JOIN)用于在多个表之间组合行。最常用的连接类型是内连接(INNER JOIN)、左外连接(LEFT OUTER JOIN)和右外连接(RIGHT OUTER JOIN)。它们的主要区别在于它们如何处理表之间的匹配和不匹配行。下面是每种连接的详细说明和示例。 表示例 假设有两个表:Customers 和 Orders。 Customers CustomerIDCus

[职场] 公务员的利弊分析 #知识分享#经验分享#其他

公务员的利弊分析     公务员作为一种稳定的职业选择,一直备受人们的关注。然而,就像任何其他职业一样,公务员职位也有其利与弊。本文将对公务员的利弊进行分析,帮助读者更好地了解这一职业的特点。 利: 1. 稳定的职业:公务员职位通常具有较高的稳定性,一旦进入公务员队伍,往往可以享受到稳定的工作环境和薪资待遇。这对于那些追求稳定的人来说,是一个很大的优势。 2. 薪资福利优厚:公务员的薪资和

Python 字符串占位

在Python中,可以使用字符串的格式化方法来实现字符串的占位。常见的方法有百分号操作符 % 以及 str.format() 方法 百分号操作符 % name = "张三"age = 20message = "我叫%s,今年%d岁。" % (name, age)print(message) # 我叫张三,今年20岁。 str.format() 方法 name = "张三"age

springboot家政服务管理平台 LW +PPT+源码+讲解

3系统的可行性研究及需求分析 3.1可行性研究 3.1.1技术可行性分析 经过大学四年的学习,已经掌握了JAVA、Mysql数据库等方面的编程技巧和方法,对于这些技术该有的软硬件配置也是齐全的,能够满足开发的需要。 本家政服务管理平台采用的是Mysql作为数据库,可以绝对地保证用户数据的安全;可以与Mysql数据库进行无缝连接。 所以,家政服务管理平台在技术上是可以实施的。 3.1

一道经典Python程序样例带你飞速掌握Python的字典和列表

Python中的列表(list)和字典(dict)是两种常用的数据结构,它们在数据组织和存储方面有很大的不同。 列表(List) 列表是Python中的一种有序集合,可以随时添加和删除其中的元素。列表中的元素可以是任何数据类型,包括数字、字符串、其他列表等。列表使用方括号[]表示,元素之间用逗号,分隔。 定义和使用 # 定义一个列表 fruits = ['apple', 'banana