欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python 中各种下划线的神操作:_、_xx、xx_、__xx__、_ _xx、_classname_ _xx

程序员文章站 2022-03-11 17:35:53
...



  通常情况下,python中定义一些变量或者方法的时候,会使用到下划线。这些下划线只是简单的一种编码规约么?一开始仅认为是编程风格的规约,后来了解到这些下划线都是很讲究的。什么情况下该使用哪种下划线,不同的下划线有什么意义,等等。接下来就介绍一下以下划线命名的各种变量正确使用姿势。

1、只有一个下划线(_)


①先来看一个例子:

python 中各种下划线的神操作:_、_xx、xx_、__xx__、_ _xx、_classname_ _xx

通过上面的例子,我们不难发现,当我输入一个下划线时,会有返回值。
其实在python解析器里,单个下划线(_)本身就是有值的。这是因为它会指向你最后一次执行的表达式,所以当我前面已经有过表达式的计算了,后面再输入下划线时会返回最近一次表达式的值。这在我们使用python交互的时候会常常用到。

②可以使用单个下划线来格式化变量的值,比如下面的例子:
python 中各种下划线的神操作:_、_xx、xx_、__xx__、_ _xx、_classname_ _xx
通过这样的方式定义变量,增加代码的可读性,而且python解析器也知道我们在做什么,解析的时候并不会出现错误。

③此外,单个下划线还可以使用在循环语句中,比如:

python 中各种下划线的神操作:_、_xx、xx_、__xx__、_ _xx、_classname_ _xx

2、单个下划线开头的(_xx)


以单个下划线开头命名的变量或者方法,说明是仅在本模块内部使用。
比如下面的例子:

创建一个模块test1,定义两个方法,其中一个以下划线开头:
def my_func():
    print("my_func")

def _my_func():
    print("_my_func")
接着创建一个模块test2,引用test1模块,执行两个方法:
from test1 import *

my_func()

_my_fun()
结果如下:

python 中各种下划线的神操作:_、_xx、xx_、__xx__、_ _xx、_classname_ _xx

不带下划线的my_func() 方法能被调用,而带下划线的已经报错了,未定义,说明它只能被test1模块内部使用。

3、单个下划线结尾的(xx_)


作为一个开发者,我们都知道python中有很多关键字,比如def、class、pass等,这些关键字都是有特殊意义的,所以我们在定义变量或者方法的时候要避免使用关键字(其他编程语言也是一样的)。但如果非要使用关键字来定义变量,为了区分关键字本身的意义,我们可以在它们的后面加上一个下划线。比如下面的例子:

def_ = 23;

def print_func():
    print(def_)

print_func()


输出结果为:
python 中各种下划线的神操作:_、_xx、xx_、__xx__、_ _xx、_classname_ _xx
但不建议这样命名。避免使用关键字定义变量名,有那么多名称可以使用,何必使用关键字找麻烦呢。

4、两个下划线开头和结尾的 “_ _ xx _ _”


这种方式是最常见的了,python中很多内置的方法都是这样定义的。
python 中各种下划线的神操作:_、_xx、xx_、__xx__、_ _xx、_classname_ _xx
对于这些python内置好的方法,叫它们为“魔法函数”,我们可以直接拿来使用。所以自己在定义函数的时候,不建议使用这种类似的两个下划线开头和结尾的方法命名。

5、两个下划线开头的命名 _ _xx


这种方式更多的是用在类的继承上。通过两个下划线开头命名的成员变量,可以防止被子类重写。
比如下面的例子:

定义一个Person类,有两个变量,一个name,一个是age。age使用两个下划线开头的命名方式。
class Person():
    def __init__(self):
        self.name="xiaoXianNu"
        self.__age=18

# 实例化Person
handsome=Person()
print(handsome.name)
print(handsome.__age)
输出结果为:

python 中各种下划线的神操作:_、_xx、xx_、__xx__、_ _xx、_classname_ _xx

通过输出结果可以看到,当实例化Person类的时候,成员变量name可以正常访问,但是 _ _age就不能访问了。
打印观察对象的属性:
python 中各种下划线的神操作:_、_xx、xx_、__xx__、_ _xx、_classname_ _xx
输出结果不难发现,对象的属性name没有变,而 _ _age已经变成了 _Person__age,变成了Person类私有的属性。
接下来再写一个Son类,来继承Person类:

class Person():
    def __init__(self):
        self.name="xiaoXianNu"
        self.__age=26

class Son(Person):
    def __init__(self):
        super().__init__()
        self.name="I am your son"
        self.__age=3

son=Son()
print(son.name)
print(son.__age)
输出结果为:

python 中各种下划线的神操作:_、_xx、xx_、__xx__、_ _xx、_classname_ _xx

通过输出的结果可以发现,子类可以重写父类的name属性,但是不能重写_ _age属性。
打印观察Son对象的属性:
python 中各种下划线的神操作:_、_xx、xx_、__xx__、_ _xx、_classname_ _xx
可以发现son对象里面的 _ _age 实际上已经变成了 _Son _ _age,变成son对象的私有属性了。
所以要想真正得到重写的age值,可以使用son对象的属性:
python 中各种下划线的神操作:_、_xx、xx_、__xx__、_ _xx、_classname_ _xx

6、一个下划线+类名+两个下划线开头的命名(_classname _ _xx)

类似于上面的5,可以使用这种方式给变量命名:_Person _ _name="nvwang" 。 可以这样使用:
_Person__name="nvWang"
class Person:
    def print_name(self):
        return __name

nvWang=Person()
print(nvWang.print_name())

python 中各种下划线的神操作:_、_xx、xx_、__xx__、_ _xx、_classname_ _xx

上面????就是关于Python中下划线的使用方式,下面????是一个简单的总结,希望对您有所帮助????

python 中各种下划线的神操作:_、_xx、xx_、__xx__、_ _xx、_classname_ _xx

相关标签: python 下划线