Python中单下划线、双下划线及魔法方法的含义与区别
本文详细解析Python中单下划线、双下划线及__xx__()魔法方法的含义与区别。单下划线表示受保护属性,双下划线实现名称改写以避冲突,魔法方法用于重载运算符。通过代码示例说明其实际应用场景与注意事项。
Python下划线命名理论概述
理论部分主要探讨Python中下划线命名的约定与机制。
- 在Python中,并不存在严格意义上的私有方法。为了模拟C++等语言中的私有成员,可以在类的方法或属性名前添加一个单下划线“_”。这表示该成员属于内部实现,不应被外部直接调用,它不属于公共API的一部分。需要注意的是,这仅仅是一个形式上的约定,Python解释器并不会阻止外部代码访问这些成员。
- 双下划线“__”的主要作用是避免名称冲突,特别是在子类继承时。其实现机制是Python解释器会自动对带有双下划线前缀的方法或属性进行名称改写,即在原名称前加上“_类名”。因此,直接通过原始名称调用带有双下划线前缀的成员会失败,必须使用改写后的名称才能访问。
- 以双下划线开头并以双下划线结尾的“__xx__”形式,通常被称为魔法方法(Magic Methods)。它们用于响应特定的语言内置操作或本地函数调用。例如,通过重写这些方法,可以自定义类的行为,如运算符重载或对象字符串表示等。
访问权限与继承机制
1、访问权限(private、public)与继承方式(只有public继承)。在面向对象编程中,类的属性和方法通常设置访问控制权限以满足设计需求。
一般而言,对象的属性会被设置为私有(private)或受保护(protected),即不允许外界直接访问;而方法通常设为公开(public),作为对象对外提供的接口。在Python中,属性和方法的访问权限主要分为公开和私有两种。若希望属性为私有,可在命名时使用两个下划线作为开头,如下方代码所示。
class Test:
def __init__(self, foo):
self.__foo = foo # 私有属性
# 定义私有函数,外界不可以直接访问,但是可以通过【_类名__函数名】去调用私有函数
def __bar(self):
print(self.__foo)
print('__bar')
def main():
"""
test = Test('hello')
# AttributeError: 'Test' object has no attribute '__bar'
test.__bar()
# AttributeError: 'Test' object has no attribute '__foo'
print(test.__foo)
"""
# 使用以下这种方式就可以在类的外部调用类的私有属性与方法
test._Test__bar()
print(test._Test__foo)
if __name__ == "__main__":
main()
在实际开发中,通常不建议将属性设置为严格私有,因为这会导致子类无法直接访问父类属性。因此,大多数Python程序员遵循一种命名惯例:使用单下划线开头来表示属性是受保护的。这意味着外部代码在访问此类属性时应保持谨慎。这并非语法层面的强制规则,单下划线开头的属性和方法在外部仍可被访问,因此它更多是一种暗示或隐喻,提示调用者不应直接访问该成员,同时不影响子类继承这些成员。
魔法方法__xx__()的使用
2、__xx__() 的使用场景与机制。
- 在Python中,如果方法名以“__xx__()”形式出现,则具有特殊功能,因此被称为“魔法”方法。
- 当使用print语句输出对象时,如果类中定义了__str__(self)方法,程序将调用该方法并打印其返回的数据。
- __str__()方法必须返回一个字符串,该字符串作为对象的字符串描述或表示。
数字时钟案例演示
案例:定义一个类描述数字时钟,展示魔法方法的实际应用。
import time
class Clock(object):
"""数字时钟"""
def __init__(self, hour=0, minute=0, second=0):
"""初始化方法
:param hour: 时
:param minute: 分
:param second: 秒
"""
self._hour = hour
self._minute = minute
self._second = second
def run(self):
"""走字"""
self._second += 1
if self._second == 60:
self._second = 0
self._minute += 1
if self._minute == 60:
self._minute = 0
self._hour += 1
if self._hour == 24:
self._hour = 0
def __str__(self):
"""显示时间"""
return '%02d:%02d:%02d' %(self._hour, self._minute, self._second)
def main():
clock = Clock(23, 59, 58)
while True:
print(clock)
time.sleep(1)
clock.run()
if __name__ == '__main__':
main()
需要注意的是,Python类中的魔法方法(如__str__、__repr__等)并非私有成员。尽管它们以双下划线开头,但也以双下划线结尾,这种命名方式不属于私有成员的命名规范。
到此这篇关于python中 _、__、__xx__()区别及使用场景的文章就介绍到这了,更多相关python _、__、__xx__() 内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













