首页 > Python资料 博客日记
【Python单点知识】类成员汇总讲解——包含类方法、静态方法、私有成员说明
2024-05-31 03:00:04Python资料围观138次
文章目录
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 = name
person1 = 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 = name
def 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:
@classmethod
def 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
装饰器标记的方法,不接受self
或cls
作为参数,它们与类或实例无关,只是简单地将函数组织到类的命名空间中。
下面是一个使用Python静态方法的实例:
class MathUtils:
"""
一个包含数学实用方法的类,其中包含一个静态方法。
"""
@staticmethod
def gcd(a, b):
input_a = a
input_b = b
while b:
a, b = b, a % b
print(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】selenium安装+Microsoft Edge驱动器下载配置流程
- Python 中自动打开网页并点击[自动化脚本],Selenium
- Anaconda基础使用
- 【Python】成功解决 TypeError: ‘<‘ not supported between instances of ‘str’ and ‘int’
- manim边学边做--三维的点和线
- CPython是最常用的Python解释器之一,也是Python官方实现。它是用C语言编写的,旨在提供一个高效且易于使用的Python解释器。
- Anaconda安装配置Jupyter(2024最新版)
- Python中读取Excel最快的几种方法!
- Python某城市美食商家爬虫数据可视化分析和推荐查询系统毕业设计论文开题报告
- 如何使用 Python 批量检测和转换 JSONL 文件编码为 UTF-8
点击排行
- 版本匹配指南:Numpy版本和Python版本的对应关系
- 版本匹配指南:PyTorch版本、torchvision 版本和Python版本的对应关系
- Python 可视化 web 神器:streamlit、Gradio、dash、nicegui;低代码 Python Web 框架:PyWebIO
- 相关性分析——Pearson相关系数+热力图(附data和Python完整代码)
- Anaconda版本和Python版本对应关系(持续更新...)
- Python与PyTorch的版本对应
- Windows上安装 Python 环境并配置环境变量 (超详细教程)
- Python pyinstaller打包exe最完整教程