文章详情页 您现在的位置是:网站首页>文章详情

悉数python中的下划线

图片丢失 Jeeyshe 发表于:2020年5月6日 21:42 分类:【Python 88次阅读

在python程序中,我们会经常看到下划线的存在,但是关于下划线的用法,你真的理解了吗?本文带你全面了解python中的所有下划线用法。

var_var、func_func,下划线作为分隔符

此类用法为python的基本风格,PEP8规范推荐函数、变量分割符为下划线,这一点不同于其他驼峰命名法(但是类的命名推荐大驼峰命名法)

open_source = "MIL"
is_valid = False


def get_user_name():
    return "Jeeyshe"

_var、_func,单下划线开头变量或方法

(1)此类变量和方法用于表示私有,是文件的内部实现

_name = "Jeeyshe"


def _show():
    print("Jeeyshe")

如上_name变量和_show方法代表的就是内部实现,仅支持本文件调用

from src.source import *

以上导入方法将会忽略掉_name, _show,但是遗憾的是,仍然可以通过单独导入的方式使用

from src.source import _name, _show

(2)用于定义抽象父类

class _BaseWorker(object):

    def __init__(self):
        self.name = None

    def get(self):
        raise NotImplementedError

    def set(self, name):
        raise NotImplementedError


class LightWorker(_BaseWorker):

    def get(self):
        return self.name or self.__class__.__name__

    def set(self, name):
        self.name = name


class NormalWorker(_BaseWorker):
    def get(self):
        return self.name or self.__str__()

    def set(self, name):
        self.name = name

var_、func_,下划线结尾变量(可多个)或方法

此种用法和普通变量并无区别,但是可以用来解决自定义资源和系统内置变量命名冲突的情况

import sys
import time


def sys_():
    time.sleep(3)
    sys.exit(0)


time_ = "Morning"

__var和__func

(1)对于普通变量核函数,此用法和_var、以及任意多下划线变量_____var完全无差别

(2)对于类中的__func方法,将阻止子类继承

class C(object):
    def __get(self):
        return self.__class__.__name__

    def get(self):
        self.__get()


class D(C):
    def has(self):
        self.__get()

此时通过D创建的实例无法调用__get方法

from src.source import C, D

if __name__ == '__main__':
    c = C()
    c.get()
    d = D()
    d.has()
    
    Traceback (most recent call last):
  File "/home/jeeyshe/Code/python/xshop/src/server.py", line 16, in <module>
    d.has()
  File "/home/jeeyshe/Code/python/xshop/src/source.py", line 91, in has
    self.__get()
AttributeError: 'D' object has no attribute '_D__get'

__var__、__func__双下划线包裹的魔术方法和变量

此类方法和变量在系统中都具有特殊的意义和用法,除非你自己直到你在干什么,否则一定不要将自己的变量方法如此定义,常用的变量方法如下

import os

root = os.path.dirname(os.path.abspath(__file__))


class XXX(object):
    def __init__(self, name, children):
        self.name = name
        self.children = children

    def __getitem__(self, item):
        return item if item in self.children else None


if __name__ == '__main__':
    file = os.path.join(root, "xxx.txt")

_特殊变量

单独的下划线也是python中的一种特殊变量(一个或多个下划线都可),这种变量可谓是一枝独秀。

(1)用于忽略一些不想要的值,如在一个列表中我们只需要第一个值

s = [1, 2, "xx"]
n, _, _ = s

(2)用于普通变量进行赋值或导入

from os import path as _

if __name__ == '__main__':
    print(_.join("/root", "xxx.txt"))
    _ = 5
    print(_)

(3)最骚操作,作为临时变量承载上一次的赋值(但是仅仅在交互式环境起作用)

In [5]: s = "xxx"                                                                                                                                                             

In [6]: _                                                                                                                                                                     
Out[6]: ''

In [7]: s                                                                                                                                                                     
Out[7]: 'xxx'

In [8]: _                                                                                                                                                                     
Out[8]: 'xxx'

python中的下划线实际上并不统一,包括单双个数,变量和方法,并没有一个统一的标准去约束。

版权声明 本文属于本站  原创作品,文章版权归本站及作者所有,请尊重作者的创作成果,转载、引用自觉附上本文永久地址: https://www.lujianxin.com/x/art/6op5r64l227y

文章评论区

作者名片

图片丢失
  • 作者昵称:Jeeyshe
  • 原创文章:40篇
  • 转载文章:3篇
  • 加入本站:418天

站点信息

  • 运行天数:419天
  • 累计访问:57762人次
  • 今日访问:133人次
  • 原创文章:48篇
  • 转载文章:4篇
  • 微信公众号:第一时间获取更新信息