yyz notes yyz notes
首页
  • RBAC权限设计
  • 架构图标设计
  • 账号体系
  • python基础
  • python高级
  • python模块
  • python设计模式
  • python数据结构与算法
  • django
  • django-DRF
  • flask
  • 直接设计开源pip包
  • 直接设计开源项目
  • python示例题/脚本
  • python面试题
  • golang基础
  • golang高级
  • golang常用组件
  • gin框架
  • es6
  • javascript
  • react
  • vue
  • TypeScript
  • mysql
  • redis
  • minio
  • elasticsearch
  • mongodb
  • 消息队列
  • 自动化测试
  • 操作系统

    • linux
    • windows
  • nginx
  • docker
  • k8s
  • git
  • ldap
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

益章

可乐鸡翅
首页
  • RBAC权限设计
  • 架构图标设计
  • 账号体系
  • python基础
  • python高级
  • python模块
  • python设计模式
  • python数据结构与算法
  • django
  • django-DRF
  • flask
  • 直接设计开源pip包
  • 直接设计开源项目
  • python示例题/脚本
  • python面试题
  • golang基础
  • golang高级
  • golang常用组件
  • gin框架
  • es6
  • javascript
  • react
  • vue
  • TypeScript
  • mysql
  • redis
  • minio
  • elasticsearch
  • mongodb
  • 消息队列
  • 自动化测试
  • 操作系统

    • linux
    • windows
  • nginx
  • docker
  • k8s
  • git
  • ldap
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • python基础

    • python概述

    • python环境搭建

    • python基础语法

    • python关键字与标识符

    • python流程控制

    • python函数

    • python内置函数

    • python面向对象

      • 面向对象、面向过程
      • 面向对象中的属性
      • 面向对象中的方法
      • 封装(三大特性)
      • 继承(三大特性)
      • 多态(三大特性)
      • 反射
      • python中的下划线
        • python中的下划线
        • 前置单下划线
        • 后置下划线
        • 前置双下划线
        • 单下划线本身_
      • python中的super()
      • python魔法方法
    • python模块与包

    • python文件IO与OS

    • python异常处理机制

  • python高级

  • python模块

  • python设计模式

  • python数据结构与算法

  • django

  • django-DRF

  • flask

  • 自己设计开源pip包

  • 自己设计开源项目

  • python小示例

  • python面试题

  • python
  • python基础
  • python面向对象
YiZhang-You
2023-05-10
目录

python中的下划线

# python中的下划线

python中的下划线主要分为如下几类:

  • 前置单下划线,如_a,_variable,主要是用于将变量或方法定义为私有属性。这里的私有属性并非如java中的私有,而是一种约定俗成,想强行访问仍旧可以正常访问。
  • 后置单下划线,如a_,val_,主要用于将变量区别,如变量名称和关键字冲突,后面加个下划线区别开来。
  • 前置双下划线,如__val,类中带前置双下划线的变量或方法,都会触发python解释器的名称修饰,是不能直接通过该名称去访问到的,实现了一定程度上的隔离。
  • 前后都有双下划线,如__init__,这类方法是python中的魔法方法,可以去重载。
  • 单下划线本身如 _,主要用于无意义的变量名。

# 前置单下划线

将变量名,方法名指定为私有属性,但在外部仍旧可以访问到。这里只是一种约定俗成,对于私有方法或变量名,代表该对象/模块的这类方法或者变量不想暴露出来,应尽量避免访问私有属性或法。

class A(object):
    def __init__(self):
        self._private=0
    def _private_method(self):
        print('AAAAA')       
>>>a=A()
>>>a._private
0
>>>a._private_method()#均能直接访问
AAAAA
1
2
3
4
5
6
7
8
9
10

# 后置下划线

主要用于区分变量名

def_=3
int_=5
1
2

# 前置双下划线

用双下划线修饰属性或者方法,即在外部访问时,该方法名或变量名会变为 类名_变量名;直接访问__变量名是不存在的。

class A(object):
    def __init__(self):
        self.__private=0
    def __private_method(self):
        print('AAAAA')
>>>a=A()
>>>a.__private
Traceback (most recent call last):
  File "<input>", line 1, in <module>
AttributeError: 'A' object has no attribute '__private'
>>>a.__private_method()#
Traceback (most recent call last):
  File "<input>", line 1, in <module>
AttributeError: 'A' object has no attribute '__private_method'
    
>>>a._A__private  # _类名__私有属性、方法
0
>>>a._A__private_method()
AAAAA
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

可以看到,这种情况下最好定义一个接口去直接访问。因为内部名称还是没变的,名称修饰主要是在实例化后调用属性或者方法时作用了。

class A(object):
    def __init__(self):
        self.__private=0
    def __private_method(self):
        print('AAAAA')
    def get_p(self):
        return self.__private
>>>a=A()
>>>a.get_p()
0
1
2
3
4
5
6
7
8
9
10

包括上面的单下划线规定的私有属性,也可以通过定义接口方法去访问,这样的好处是私有的方法或者属性无法被篡改,可以很好的保护起来。这里可以和@property结合起来使用。

# 单下划线本身_

>>>a=[_ for _ in range(10)]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

>>>a,_,_,d=func(*args,**kwargs)
#这种情况是我们只想要返回的第一个和第四个参数,中间两个对于当前模块没啥意义,就无需去定义一个变量名称。
1
2
3
4
5
编辑 (opens new window)
上次更新: 2023/05/17, 23:08:21
反射
python中的super()

← 反射 python中的super()→

最近更新
01
配置yun源
05-24
02
linux-配置python虚拟环境
05-24
03
linux文件目录管理
05-24
更多文章>
Theme by Vdoing | Copyright © 2023-2023 yizhang | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式