Python3进阶之变量和方法命名中各种下划线的含义和区别详解(高级开发必掌握)

目录

开篇名义

名称修饰(name mangling)

1. 单前缀单下划线(_var)

2. 单末尾下划线(var_)

3. 单下划线(_)

4. 双前导下划线(__var)

5. 前后双下划线(__var__)

总结


图片

更多关于Python的相关技术点,敬请关注公众号:CTO Plus后续的发文,有问题欢迎后台留言交流。

公众号:CTO Plus

一个有深度和广度的技术圈,技术总结、分享与交流,我们一起学习。 涉及网络安全、C/C++、Python、Go、大前端、云原生、SRE、SDL、DevSecOps、数据库、中间件、FPGA、架构设计等大厂技术。 每天早上8点10分准时发文。

接下来的一段时间我将总结关于【Python进阶系列】的一系列开发技术知识点的分享文章,主要为初学者从零基础到进阶再到高级和项目实战,结合目前最新的Python版本3.12来做代码示例的样式,并同时也会标注出与Python2的一些异同点。

原文:Python3进阶之变量和方法命名中各种下划线的含义和区别详解(高级开发必掌握)

然后关于Python的Web开发、爬虫开发、操作系统开发、网络安全开发应用领域这块,可以分别参考我的公众号CTO Plus【Flask进阶系列】、【Django进阶系列】、【DRF进阶系列】、【互联网分布式爬虫系列】和【网络安全系列】的内容,敬请关注,欢迎交流。

图片

以下是【Python3进阶系列】的部分内容

图片

Python3中的变量命名可以使用各种下划线,包括单下划线、双下划线和前后双下划线。单下划线和双下划线在Python变量和方法名称中都各有其含义。有一些含义仅仅是依照约定,被视作是对开发人员的提示,而有一些含义是由Python解释器严格执行的。

本篇文章我将为各位Pythoner介绍和总结变量和方法名称中单下划线和双下划线的各种含义和命名约定,名称修饰(name mangling)的工作原理,以及它如何影响你自己的Python类。我会尽我所能在这里帮助读者深入解答这些功能特性。

通过本文的介绍,读者将能够深入理解Python3中名称修饰的工作原理和作用。名称修饰是Python3中的重要特性之一,对于编写可维护、可扩展和安全的类具有重要意义。掌握名称修饰的使用方法能够帮助开发者更好地理解Python的面向对象编程范式,并提高代码的质量和可读性。

在本文中,我主要将讨论以下五种下划线模式和命名约定,以及它们是如何影响Python程序的行为的:

  • 单前导下划线:_var

  • 单末尾下划线:var_

  • 双前导下划线:__var

  • 双前导和末尾下划线:__var__

  • 单下划线:_

同时学习完本篇后,将为下一篇文章《Python3进阶之内置魔法方法(双下划线开头和结尾)总结大全》可以做个很好的铺垫。

开篇名义

这里,我直接将这些下划线的含义和区别放出来,下面是关于使用下划线的常见命名约定和区别的总结:

1. 单个下划线 _:在Python中,单个下划线通常被用作一个临时变量或一个无关紧要的变量。它通常用于循环中,表示一个不需要的循环变量。

2. 前导单个下划线_variable:这种命名约定被用作一种约定,表示变量是受保护的,不应该被外部代码直接访问。它是一种弱约定,仅仅是一种提醒而已,Python并不会强制执行访问限制。

3. 后导单个下划线variable_:在Python中,后导下划线被用作一种区别,以避免与Python关键字或内置函数重名。它可以用作变量名的一部分,以避免命名冲突。

4. 双下划线 __: 双下划线用于名称修饰,称为名称修饰符(name mangling)。一般用在类中,将属性或方法变成私有的。Python会自动将双下划线开头的变量名进行重命名处理,以避免子类中的命名冲突。

5. 前导和后导双下划线__variable__:这种命名约定通常被用作“魔术方法”或“特殊方法”的命名。特殊方法是用于在Python中实现特定功能的预定义方法,例如__init__用于初始化对象,__str__用于定义对象的字符串表示等。这些特殊方法有特殊的调用规则和行为。

名称修饰(name mangling)

首先介绍下Python3的名称修饰(name mangling),相信也有不少开发人员还不知道这个专业术语。它是一种特殊的命名规则,用于保护类的私有属性和方法,防止被外部访问。

1.名称修饰的概念

在Python中,名称修饰是一种特殊的命名规则,用于将类的私有属性和方法进行命名转换,从而保护其不被外部访问。名称修饰的规则是将属性名或方法名前面添加两个下划线__,例如__name、__method等。

类,是面向对象的内容,我将在后面使用大量的篇幅来详细介绍Python面向对象的特性,如果你是Python的初学者,这里可以先了解了解。面向对象的内容敬请关注公众号CTO Plus后面的文章:

  1. 1.       《Python3进阶之面向对象编程基础(开发必掌握的知识点)》

  2. 2.       《Python3进阶之类的属性和方法访问权限及property装饰器的实践详解》

  3. 3.       《Python3进阶之深入了解类的创建及元类metaclass实践详解》

  4. 4.       《Python3高级之面向对象的封装与访问控制实践详解》

  5. 5.       《Python3高级之类的私有属性和__slots__禁止访问类的实例属性详解》

  6. 6.       《Python3高级之对象的属性及属性的管理实践详解》

  7. 7.       《Python3高级之深入了解类的工作原理及类的初始化顺序详解》

  8. 8.       《Python3高级之类的属性描述符和应用案例实践详解》

2. 名称修饰的工作原理

Python3中的名称修饰是通过一种特殊的命名转换方式来实现的,具体工作原理如下:

  • 对于类内部定义的私有属性和方法,Python会将其名称转换为_类名__属性名_类名__方法名的格式,例如__name会被转换为_ClassName__name。

  • 在类外部访问私有属性和方法时,需要使用转换后的名称进行访问,例如obj._ClassName__name。

  • 名称修饰只是一种命名转换的方式,Python并不会对属性或方法进行任何的访问控制,因此仍然可以通过转换后的名称来访问私有属性和方法

3. 名称修饰的作用

名称修饰主要用于保护类的私有属性和方法,防止被外部访问。通过名称修饰,可以将类的内部实现细节和外部接口分离,提高代码的可维护性和安全性。同时,名称修饰也可以避免属性和方法的命名冲突,增强代码的可读性和可靠性。name

更多关于Python的相关技术点,敬请关注公众号:CTO Plus后续的发文,有问题欢迎后台留言交流。

图片

4. 示例

下面是一个简单的示例,演示了名称修饰的使用:

 

# @author:SteveRocket # @Date:2023/11/18# @File:demo3_name_mangling# @Email:rocket_2014@126.com# @CSDN:https://blog.csdn.net/zhouruifu2015/# @WeChat:https://mp.weixin.qq.com/s/0yqGBPbOI6QxHqK17WxU8Qfrom inner_module_def_datastruct import AGE, AUTHOR, WEIXIN_URLclass MyClass:    def __init__(self):        # 定义两个私有属性并赋值        self._private_var = AGE        self.__my_blog = WEIXIN_URL
    def __private_method(self):        """        私有方法        :return:        """        print(f"this is private method, my name is {AUTHOR}")
    def public_method(self):        """        公有方法        :return:        """        print(f"this is public method, this is my blog {WEIXIN_URL}")        # 使用私有属性        print(f"my age is {self._private_var}")        # 调用私有方法        self.__private_method()
obj = MyClass()obj.public_method()# this is public method, this is my blog https://mp.weixin.qq.com/s/0yqGBPbOI6QxHqK17WxU8Q# my age is 25# this is private method, my name is SteveRocket
obj._MyClass__private_method() # 通过名称修饰访问私有方法# this is private method, my name is SteveRocket
# print(obj._MyClass_private_var)  # AttributeError: 'MyClass' object has no attribute '_MyClass_private_var'# print(obj._MyClass__private_var) # AttributeError: 'MyClass' object has no attribute '_MyClass__private_var'
# 通过名称修饰访问私有属性print(obj._MyClass__my_blog) # 输出 https://mp.weixin.qq.com/s/0yqGBPbOI6QxHqK17WxU8Q

在上述示例中,MyClass类定义了一个私有属性__my_blog和_private_var以及一个私有方法__private_method,并通过名称修饰的方式对其进行保护。在类的外部,可以通过名称修饰的方式来访问私有属性和方法,从而实现对类的访问控制和保护。

从这个例子中可以看出双下划线名称修饰对开发者是完全透明的。

接下来介绍下各种下划线的含义和使用方法

1. 单前缀单下划线(_var)

在Python中,单下划线前缀的变量通常被用作临时或无关紧要的变量。它们被称为“私有变量”,表示这些变量只在局部范围内使用,不会被外部直接访问。

当涉及到变量和方法名称时,单个下划线前缀有一个约定俗成的含义。它是对开发者的一个提示,意味着Python社区一致认为它应该是某种特定专属的意思,但程序的行为不受影响。即下划线前缀的含义是告知其他开发者:以单个下划线开头的变量或方法仅供内部使用,该约定在PEP 8中有定义,这不是Python强制规定的。Python不像Java那样在“私有”和“公共”变量之间有很强的区别。

代码示例:单下划线在变量和函数上的使用情况

 

# @author:SteveRocket # @Date:2023/11/18# @File:demo4_var_method# @Email:rocket_2014@126.com# @CSDN:https://blog.csdn.net/zhouruifu2015/# @WeChat:https://mp.weixin.qq.com/s/0yqGBPbOI6QxHqK17WxU8Qfrom inner_module_def_datastruct import AGE, AUTHOR
class MyClass:    """    单下划线在变量和方法中的使用示例    """    _author = AUTHOR    age = AGE
    def __init__(self):        self.user = 'steverocket'        self._blog = '公众号:CTO Plus'
    def calculate_average(self, numbers):        _sum = sum(numbers)        _count = len(numbers)        _average = _sum / _count        return _average
    def _show_msg(self, author="SteveRocket"):        return author
demo_obj = MyClass()print(demo_obj.calculate_average([1, 2, 3, 4]))  # 2.5print(demo_obj._show_msg())  # SteveRocketprint(demo_obj._author)  # SteveRocketprint(demo_obj.age)  # 25print(demo_obj.user)  # steverocketprint(demo_obj._blog) # 公众号:CTO Plus

在上述代码中,_sum、_count和_average都是私有变量(临时变量),只在calculate_average函数内部使用,表示不需要被外部访问。

从输出结果可以看出来,实例化上面的类之后,并尝试访问在__init__构造函数中定义的_blog和在类中定义的变量_author,可以看到_author和_blog中的单个下划线并没有阻止我们“进入”类并访问该变量的值。以及私有函数_show_msg我们依然可以调用使用。

这是因为Python中的单个前缀下划线仅仅是一个约定,至少相对于变量和方法名而言。但是,前导下划线的确会影响从模块中导入名称的方式。

代码示例2:单下划线在代码包(模块)下的使用

关于代码包(模块)的介绍在前面的文章有介绍《Python3进阶之开发必备的知识点-模块(包)的作用和使用详解》,这里接着这篇文章的代码环境继续做介绍。

在pkg01的包中新建一个module02.py的模块,代码如下:

def _function():    print("this is _function")
def __function():    print("this is __function")
def __function__():    print("this is __function__")

现在,如果使用通配符从模块中导入所有名称,则Python不会导入带有前导下划线的名称(除非模块定义了覆盖此行为的__all__列表):

from pkg01.module01 import *# 直接调用函数function("module01")   # this is function module01# 直接使用变量print(my_blog)  # https://mp.weixin.qq.com/s/0yqGBPbOI6QxHqK17WxU8Q# 直接使用类obj = DemoClass()obj.show("this is module01")  # this is module01
# 使用通配符导入,下面带有前缀下划线的变量全都不能被导入使用# print(__author__) # NameError: name '__author__' is not defined# print(_age)  # NameError: name '_age' is not defined. Did you mean: 'range'?
from pkg01.module02 import *# 使用通配符导入,下面的module02中的方法全都不能被导入使用# _function()  # NameError: name '_function' is not defined. Did you mean: 'function'?# __function() # __function__()

注意:我们应该避免使用通配符导入,因为它们使名称空间中存在哪些名称而不清楚。为了清楚起见,坚持常规标准化导入更好。

与通配符导入不同,常规导入不受前导单个下划线命名约定的影响:

from pkg01 import module02

# 不使用通配符的方式导入,则还可以使用

module02._function() # this is _function

module02.__function() # this is __function

module02.__function__() # this is __function__

各位可能对这一点有所困惑,不过只要我们遵循PEP 8开发规范,避免通配符导入即可。那么你真正需要记住的只有这个:单个下划线是一个Python命名约定,表示这个名称是供内部使用的。它通常不由Python解释器强制执行,仅仅作为一种对开发者的提示。

推荐阅读《通读Python PEP8代码规范

更多关于Python的相关技术点,敬请关注公众号:CTO Plus后续的发文,有问题欢迎后台留言交流。

图片

2. 单末尾下划线(var_)

接下来介绍下单末尾下划线的变量。有时候,一个变量的最合适的名称已经被一个关键字所占用。因此,像class或def这样的名称不能用作Python中的变量名称。在这种情况下,你可以附加一个下划线来解决命名冲突的问题:

# def make_object(name, class): # SyntaxError: invalid syntax#     pass
def make_object(name, class_):    pass
# class class:  # SyntaxError: invalid syntax#     pass
class class_:    pass

总之,单个末尾下划线(后缀)是一个约定,用来避免与Python关键字产生命名冲突。

PEP 8解释了这个约定,推荐阅读《通读Python PEP8代码规范

3. 单下划线(_)

按照习惯,有时候单个独立下划线是用作一个名字,来表示某个变量是临时的或无关紧要的(需要忽略的)。

例如,在下面的循环中,我们不需要访问正在运行的索引,我们可以使用“_”来表示它只是一个临时值:

图片

                     

你也可以在拆分(unpacking)表达式中将单个下划线用作“不关心的”变量,以忽略特定的值。同样,这个含义只是“依照约定”,并不会在Python解释器中触发特殊的行为。单个下划线仅仅是一个有效的变量名称,会有这个用途而已。

在下面的代码示例中,我将元组person拆分为单独的变量,如果只需要age、msg或weixin,则将对应元素进行位置赋值即可。但是,为了使拆分表达式成功运行,需要将包含在元组中的所有值分配给变量。在这种情况下,“_”作为占位符变量可以派上用场:

图片

除了用作临时变量之外,“_”是大多数Python REPL中的一个特殊变量,它表示由解释器评估的最近一个表达式的结果。

这样就很方便了,比如你可以在一个解释器会话中访问先前计算的结果,或者,你是在动态构建多个对象并与它们交互,无需事先给这些对象分配名字:

图片

这一特性在最新的Python3.12中也支持。

4. 双前导下划线(__var)

到目前为止,我们所涉及的所有命名模式的含义,均来自于已达成共识的约定。而对于以双下划线开头的Python类的属性(包括变量和方法),情况就有点不同了。双下划线前缀的变量被用作类的私有变量。它们被称为名称修饰(name mangling),双下划线前缀会导致Python解释器重写(更改)属性名称,以便在类被扩展的时候不容易产生冲突(避免子类中的命名冲突)。在文章开头就已经介绍了这一特点,它表示这些变量只能在类的内部被访问,不能被外部直接访问。例如:

class Person:    def __init__(self, name, age):        self.__name = name        self.__age = age            def get_name(self):        return self.__name        def get_age(self):        return self.__age

在上述代码中,__name和__age是Person类的私有变量,只能通过get_name和get_age方法来访问,不能直接访问。

观察对象的属性

class MyClass02:    def __init__(self):        self.age = AGE        self._author = AUTHOR        self.__blog = WEIXIN_URL
obj = MyClass02()print(dir(obj))

用内置的dir()函数来看看这个对象的属性:

['_MyClass02__blog', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_author', 'age']

这是这个对象属性的列表,其中:

self.age变量在属性列表中显示为未修改的age。

self._author的行为方式与age的相同,它以_author的形式显示在类上。就像我之前说过的,在这种情况下,前导下划线仅仅是一个约定,给开发者一个提示,对外部调用者可以忽略掉而已。

更多关于Python的相关技术点,敬请关注公众号:CTO Plus后续的发文,有问题欢迎后台留言交流。

图片

然而,对于self.__blog而言,情况看起来有点不同。当你在该列表中搜索__blog时,你会看不到有这个名字的变量。如果你仔细观察,你会看到此对象上有一个名为_MyClass02__blog的属性。这就是Python解释器所做的名称修饰。它这样做是为了防止变量在子类中被重写。

让我们创建另一个扩展MyClass02类的类,并尝试重写构造函数中添加的现有属性:

class SubMyClass02(MyClass02):    """    集成自MyClass02    """    def __init__(self):        super().__init__()        self.age = 0        self._author = 'steverocket'        self.__blog = 'cto plus'
sub_obj = SubMyClass02()print(dir(sub_obj))print(sub_obj.age)   # 0print(sub_obj._author) # steverocket
# print(sub_obj._SubMyClass02_author)  # AttributeError: 'SubMyClass02' object has no attributeprint(sub_obj._SubMyClass02__blog) # cto plus# # print(sub_obj.__blog) # AttributeError: 'SubMyClass02' object has no attribute '__blog'

从上面输出结果可以看出来,当我们尝试查看sub_obj.__blog的值时,为什么我们会得到AttributeError?名称修饰被再次触发了,事实证明,这个对象甚至没有__blog属性:

['_MyClass02__blog', '_SubMyClass02__blog', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_author', 'age']

如上你可以看到__blog变成了_MyClass02__blog,从而达到以防止被意外修改。

名称修饰在方法中的使用

在开篇的名称修饰中介绍过,这一特性也适用于方法名称,名称修饰会影响在一个类的上下文中。这里还是以名称修饰中的代码为示例:

 

from inner_module_def_datastruct import AGE, AUTHOR, WEIXIN_URL
_MyClass__message = "this is global var"class MyClass:    def __init__(self):        # 定义两个私有属性并赋值        self._private_var = AGE        self.__my_blog = WEIXIN_URL
    def __private_method(self):        """        私有方法        :return:        """        print(f"this is private method, my name is {AUTHOR}")
    def public_method(self):        """        公有方法        :return:        """        print(f"this is public method, this is my blog {WEIXIN_URL}")        # 使用私有属性        print(f"my age is {self._private_var}")        # 调用私有方法        self.__private_method()
    def mangling(self):        return __message

MyClass().public_method()# this is public method, this is my blog https://mp.weixin.qq.com/s/0yqGBPbOI6QxHqK17WxU8Q# my age is 25# this is private method, my name is SteveRocket
# MyClass().__private_method()  # AttributeError: 'MyClass' object has no attribute '__private_method'
obj = MyClass()print(obj.mangling())  # this is global var

这里仔细看的话,可以看到几处比较有意思的特点,其中在代码外部定义了一个包含与类型同名的全局变量_MyClass__message,然后在类方法mangling中return返回了一个变量__message,从编译器中看到这里已经被提示标红,但是运行代码不仅没有报错,反而输出了全局变量_MyClass__message的值,其实这也是名称修饰的一个特性。

图片

注意:这里我在名为MyClass的类的上下文中访问这个变量。由于名称修饰,我们能够在类的mangling()方法内,以__message来引用_MyClass__message全局变量。而不能在任何其他非MyClass类中引用,比如下面的两个类,一个继承了MyClass,另外一个未继承,都不能直接以__message来引用_MyClass__message全局变量。

class OtherClass01(MyClass):    """继承了MyClass"""    def mangling(self):        # return __message  # NameError: name '_OtherClass01__message' is not defined.        return _MyClass__message
OtherClass01().mangling()
class OtherClass02:    """未继承MyClass"""    def mangling(self):        # return __message  # NameError: name '_OtherClass02__message' is not defined        return _MyClass__message
OtherClass02().mangling()

Python解释器自动将名称__message扩展为_MyClass__message,因为它以两个下划线字符开头。这表明名称修饰不是专门与类属性关联的。它是适用于在类上下文中使用的两个下划线字符开头的任何名称。

5. 前后双下划线(__var__)

接下来介绍下前后双下划线的变量,这种变量被称为“魔术方法”或“特殊方法”,用于实现Python的特殊功能。这些方法在类中具有特殊的含义,例如__init__方法用于初始化对象,__str__方法用于返回对象的字符串表示等。这些方法由Python内部调用,不需要手动调用。

更多的前后双下划线变量将在下一盘文章《Python3进阶之内置魔法方法(双下划线开头和结尾)总结大全》中做详细介绍,敬请关注公众号CTO Plus。

代码示例:

 

# @author:SteveRocket # @Date:2023/11/19# @File:oop1# @Email:rocket_2014@126.com# @CSDN:https://blog.csdn.net/zhouruifu2015/# @WeChat:https://mp.weixin.qq.com/s/0yqGBPbOI6QxHqK17WxU8Qfrom inner_module_def_datastruct import WEIXIN_URL, AGE, AUTHOR

class MyClass:    def __init__(self, age, name, blog):        self.age = age        self.name = name        self.blog = blog        self.__age = 1        self.__name = name        self.__blog__ = WEIXIN_URL
    def __str__(self):        return f"my name is {AUTHOR}"
    def __custom_method__(self):        """前后双下划线 应用于自定义的函数"""        return self.age
obj = MyClass(12, "steverocket", WEIXIN_URL)print(obj)  # my name is SteveRocketprint(obj.__custom_method__())  # 12print(obj.__custom_method__())print(obj._MyClass__age)  # 1
print(obj._MyClass__name) # steverocket

在上述代码中,__init__和__str__方法是MyClass类的特殊方法,用于初始化对象(对象构造函数)和返回对象的字符串表示。而__custom_method__是我自己自定义的方法。

更多关于Python的相关技术点,敬请关注公众号:CTO Plus后续的发文,有问题欢迎后台留言交流。

图片

需要注意的是,虽然双下划线前缀的变量被认为是私有变量,但实际上它们只是被重命名为了一个较长的名称,可以通过特定的方式来访问。例如,可以通过"_类名__变量名"的方式来访问双下划线前缀的变量。例如在上述代码中,通过_MyClass__age和_MyClass__name的方式可以访问MyClass类的__age和__name变量。

同时,如果一个名字同时以双下划线开始和结束,如__blog__,则不会应用名称修饰,也即由双下划线前缀和后缀包围的变量不会被Python解释器修改。

print(obj.__blog__) # https://mp.weixin.qq.com/s/0yqGBPbOI6QxHqK17WxU8Q

Python内部保留了有双前导和双末尾下划线的名称,用于特殊用途。比如还有__call__ 它使得一个对象可以被调用。这些dunder方法通常被称为魔法(神奇)方法。最好避免在自己的程序中使用以双下划线(“dunders”)开头和结尾的名称,以避免与将来Python语言的变化产生冲突。

更多的前后双下划线变量将在下一盘文章《Python3进阶之内置魔法方法(双下划线开头和结尾)总结大全》中做详细介绍,敬请关注公众号CTO Plus。

总结

总结起来,Python3中的变量命名可以使用各种下划线,包括单下划线、双下划线和前后双下划线等。其中,单下划线通常用作临时变量,双下划线用作类的私有变量,前后双下划线用作特殊方法。这些下划线的使用有助于提高代码的可读性和维护性,同时也有助于保护变量的访问权限。通过理解和应用这些下划线的含义和区别,可以更好地编写Python代码。

总之,使用下划线来命名变量可以提供一些约定和提示,帮助我们编写更清晰和易于理解的代码。不同的下划线约定有不同的含义和用途,我们应根据需要选择适合的命名约定。

Python专栏
https://blog.csdn.net/zhouruifu2015/category_5742543

欢迎关注公众号CTO Plus,有问题欢迎后台留言交流。

更多精彩,关注我公号,一起学习、成长

CTO Plus

一个有深度和广度的技术圈,技术总结、分享与交流,我们一起学习。 涉及网络安全、C/C++、Python、Go、大前端、云原生、SRE、SDL、DevSecOps、数据库、中间件、FPGA、架构设计等大厂技术。 每天早上8点10分准时发文。

306篇原创内容

公众号

标准库系列-推荐阅读:

推荐阅读:

最后,不少粉丝后台留言问加技术交流群,之前也一直没弄,所以为满足粉丝需求,现建立了一个关于Python相关的技术交流群,加群验证方式必须为本公众号的粉丝,群号如下:

图片

Python3进阶之变量和方法命名中各种下划线的含义和区别详解(高级开发必掌握)

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SteveRocket

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值