Python用下划线

Python用下划线为变量前缀和后缀制定特殊变量

_xxx 不能用 'from module import *' 导入
__xxx__ 系统定义名字
__xxx 类中的私有变量名

核心风格:避免用下划线作为变量名的开始

因为下划线对解释器有特殊的意义,而且内建的标识符所使用的符号,我们建议程序员避免用下划线作为变量名的开始。
一般来讲,变量名_xxx被看做是'私有的',在模块和类外不可以使用。当变量是私有的时候,用_xxx来表示变量是很好的习惯
因为变量名__xxx__对python来说有特殊含义,对于普通的变量应当避免这种命名风格。

'单下划线':开始的成员变量叫做保护变量,意思是只有类对象和子类对象自己能访问到这些变量;
'双下划线':开始的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据。

实例:

class Foo(object):
def __init__(self, name, age):
self._name = name # 单下划线开始的成员变量叫做保护变量,只有类对象和子类对象自己能访问到这些变量
self.__age = age # 双下划线是私有成员,只有类的内部能调用,类对象能够访问,但是应该避免直接去访问 f = Foo('hkey', 20)
print(f.__dict__) # 打印对象所有的属性和方法
print(f._name) # 执行结果:
# {'_Foo__age': 20, '_name': 'hkey'}
# hkey

以单下划线开头(_name)的代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用'from xxx import *'导入
以双下划线开头的(__age)代表类的私有成员;
以双下划线开头和结尾的(__foo__)代表python里特殊方法专用的标识,如__init__()代表类的构造函数。

类中特殊方法的使用

__new__:类中的构造方法
__init__: 类中的初始化方法

class A(object):
def __init__(self):
print('init') def __new__(cls, *args, **kwargs):
print('new %s' %cls)
return object.__new__(cls, *args, **kwargs) A() # 执行结果:
# new <class '__main__.A'>
# init

知识点:
1. 继承自object的新式类才有 __new__
2. __new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由python解释器自动提供;
3. __new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意;
4. __init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些其他初始化的动作,
__init__不需要返回值,__new__方法一定要有返回值
5. 若__new__没有正确返回当前cls的实例,那__init__是不会被调用的,即使是父类的实例也不行;

__len__:如果类表现的像一个list,要获取有多少个元素,就得用 len()函数,要让len()函数工作正常,类必须提供一个
特殊的方法 __len__(),它返回元素的个数;

实例:

class Student(object):
def __init__(self, *args):
self.names = args def __len__(self):
return len(self.names) s = Student('xiaofei', 'hkey', 'xiaoA') print(len(s)) # 执行结果:
# 3

__str__ 和 __repr__

使用__str__和__repr__ 打印类的对象,返回的不再是一个内存地址,而是定义后字符串内容,__str__和__repr__返回的必须是字符串类型:

class Student(object):
def __init__(self, name):
self.name = name
def __str__(self):
return 'Student object (name: %s)' % self.name s = Student('hkey')
print(s)
# 用内置方法 str 和 repr 调用
print(str(s))
print(repr(s)) # 执行结果:
# Student object (name: hkey)
# Student object (name: hkey)
# print(repr(s))执行结果:
# <__main__.Student object at 0x000001D0EB04BC18>

在上面的实例中没有定义__repr__特殊方法,当使用内置方法 repr 调用的时候显示的是类的内存地址信息,这两者的区别:
__str__:返回用户看到的字符串
__repr__:返回程序开发者看到的字符串,也就是说__repr__()为调试使用的。

这里有个偷懒的写法:

class Student(object):
def __init__(self, name):
self.name = name
def __str__(self):
return 'Student object (name: %s)' % self.name
__repr__ = __str__ s = Student('hkey')
print(s)
# 用内置方法 str 和 repr 调用
print(str(s))
print(repr(s)) # 执行结果:
# Student object (name: hkey)
# Student object (name: hkey)
# print(repr(s))执行结果:
# Student object (name: hkey)

在类中,定义这两个特殊方法的时候要要注意:
    当使用内置方法 str 对类对象进行调用的时候,首先会去找类中的 __str__方法,如果不存在就会找 __repr__方法,
    所以如果实现这两个特殊方法返回的结果一致时,简单方式就是写一个__repr__的特殊方法就行;

__call__:可以直接对实例进行调用

实例:

class Student(object):
def __init__(self, name):
self.name = name def __call__(self, *args, **kwargs):
print('My name is %s.' % self.name) s = Student('hkey')
s() # 执行结果:
# My name is hkey.

反射及item系列的特殊方法

[ python ] 下划线的意义和一些特殊方法的更多相关文章

  1. Python里的单下划线,双下划线,以及前后都带下划线的意义

    Python里的单下划线,双下划线,以及前后都带下划线的意义: 单下划线如:_name 意思是:不能通过from modules import * 导入,如需导入需要:from modules imp ...

  2. Python下划线与命名规范

    Python下划线与命名规范 先看结论,节省只想知道答案你的宝贵时间: _xxx 不能用于from module import * 以单下划线开头的表示的是protected类型的变量.即保护类型只能 ...

  3. Python下划线简介

    Python中下划线的5种含义 分享一篇文章:The Meaning of Underscores in Python. 本文介绍了Python中单下划线和双下划线("dunder" ...

  4. python下划线的5种含义

    本文介绍了Python中单下划线和双下划线("dunder")的各种含义和命名约定,名称修饰(name mangling)的工作原理,以及它如何影响你自己的Python类. 单下划 ...

  5. python中有两个下划线__的是内置方法,一个下划线_或者没有下划线的可能是属性,也可能是方法,也可能是类名

    python中有两个下划线__的是内置方法,一个下划线_或者没有下划线的可能是属性,也可能是方法,也可能是类名,如果在类中定义的就是类的私有成员. >>> dir(__builtin ...

  6. python下划线变量的含义

    _xxx      不能用'from module import *'导入 __xxx__ 系统定义名字 __xxx    类中的私有变量名 核心风格:避免用下划线作为变量名的开始. "单下 ...

  7. python 下划线的使用(转载:安生犹梦 新浪博客)

    Python 用下划线作为变量前缀和后缀指定特殊变量. _xxx      不能用'from module import *'导入 __xxx__ 系统定义名字 __xxx    类中的私有变量名 核 ...

  8. Python下划线的使用 _ __ __obj__

    Python 用下划线作为变量前缀和后缀指定特殊变量.   _xxx 不能用'from moduleimport *'导入 __xxx__ 系统定义名字 __xxx 类中的私有变量名   核心风格:避 ...

  9. Python下划线的使用

    References: [1]. http://python.jobbole.com/81129/ 本文将讨论Python中下划线(_)字符的使用方法.我们将会看到,正如Python中的很多事情,下划 ...

随机推荐

  1. 【题解】CF#983 E-NN country

    首先,我们从 u -> v 有一个明显的贪心,即能向上跳的时候尽量向深度最浅的节点跳.这个我们可以用树上倍增来维护.我们可以认为 u 贪心向上跳后不超过 lca 能跳到 u' 的位置, v 跳到 ...

  2. [HAOI2007]分割矩阵 DP+推式子

    发现最近好少写博客啊(其实是各种摆去了) 更一点吧 这道题要求最小化均方差,其实凭直觉来说就是要使每个块分的比较均匀一点,但是单单想到想到这些还是不够的, 首先f[i][j][k][l][t]表示以( ...

  3. NOIP2017 列队——平衡树

    平衡树蒟蒻,敲了半天. 其实思路很简单,就是把许多个人合并成一个区间.必要的时候再拆开.(是不是和这个题的动态开点线段树有异曲同工之妙?) 每次操作最多多出来6个点. 理论上时间复杂度是nlogn,空 ...

  4. django-jet 中文文档

    关于 JET是新式的Django管理界面并且增强了功能.     内容 文档 开始 安装django-jet 安装仪表盘 配置 配置文件 自动补全 紧凑内联 过滤器 仪表盘 自定义仪表盘 仪表盘模块 ...

  5. AIDL 简单实现

    实现步骤1.建立一个aidl文件,在里面定义好接口,注意里面不能写public修饰符,同接口一样,包名要一致. package com.systemset.aidl; interface ILight ...

  6. bzoj1177 [Apio2009]Oil 二维前缀最大值,和

    [Apio2009]Oil Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 2300  Solved: 932[Submit][Status][Disc ...

  7. 关于mysql 删除数据后物理空间未释放

    转载自:http://www.cnblogs.com/shawnloong/archive/2013/02/07/2908911.html OPTIMIZE TABLE 当您的库中删除了大量的数据后, ...

  8. JavaScript中this的用法详解

    JavaScript中this的用法详解 最近,跟身边学前端的朋友了解,有很多人对函数中的this的用法和指向问题比较模糊,这里写一篇博客跟大家一起探讨一下this的用法和指向性问题. 1定义 thi ...

  9. II8部署WCF服务出错

    环境:Windows 2012 R2 + IIS 8.0 + .NET 4.5 错误404.3 - Not Found: 控制面板->程序->启用或关闭Windows功能,如下图所示,将需 ...

  10. Send Email in Robot Framework Python Using Gmail

    转载自:http://seleniummaster.com/sitecontent/index.php/selenium-robot-framework-menu/selenium-robot-fra ...