python any,call,init,下划线知识汇总
python补充
any()
【来自菜鸟教程】
any() 函数用于判断给定的可迭代参数 iterable 是否全部为 False,则返回 False,如果有一个为 True,则返回 True。
元素除了是 0、空、FALSE 外都算 TRUE。
函数等价于:
def any(iterable):
for element in iterable:
if element:
return True
return False
>>>any(['a', 'b', 'c', 'd']) # 列表list,元素都不为空或0
True
>>> any(['a', 'b', '', 'd']) # 列表list,存在一个为空的元素
True
>>> any([0, '', False]) # 列表list,元素全为0,'',false
False
>>> any(('a', 'b', 'c', 'd')) # 元组tuple,元素都不为空或0
True
>>> any(('a', 'b', '', 'd')) # 元组tuple,存在一个为空的元素
True
>>> any((0, '', False)) # 元组tuple,元素全为0,'',false
False
>>> any([]) # 空列表
False
>>> any(()) # 空元组
False
call和init方法
https://www.cnblogs.com/yinyoupoet/p/13287359.html
python类中,__init__和__call__方法都是用来初始化类的,但是它们之间存在一些区别。
__init__是用来在初始化类的对象时被调用,同时可以传入一些参数。
__call__用来在调用该对象时被触发。
具体可以看下面的例子
class A:
def __init__(self):
print "init"
def __call__(self):
print "call"
a = A() # 输出 init
a() # 输出 call
下划线的含义
Python中下划线的5种含义 - 地球的外星人君的文章 - 知乎 https://zhuanlan.zhihu.com/p/36173202
单前导下划线:_var
单末尾下划线:var_
双前导下划线:__var
双前导和末尾下划线:var
单下划线:_
单前导下划线 _var
当涉及到变量和方法名称时,单个下划线前缀有一个约定俗成的含义。 它是对程序员的一个提示 - 意味着Python社区一致认为它应该是什么意思,但程序的行为不受影响。
下划线前缀的含义是告知其他程序员:以单个下划线开头的变量或方法仅供内部使用。
这不是Python强制规定的。 Python不像Java那样在“私有”和“公共”变量之间有很强的区别。 这就像有人提出了一个小小的下划线警告标志,说:
“嘿,这不是真的要成为类的公共接口的一部分。不去管它就好。“
单个下划线是一个Python命名约定,表示这个名称是供内部使用的。 它通常不由Python解释器强制执行,仅仅作为一种对程序员的提示。
单末尾下划线:var_
解决和关键字的命名冲突
有时候,一个变量的最合适的名称已经被一个关键字所占用。 因此,像class或def这样的名称不能用作Python中的变量名称。 在这种情况下,你可以附加一个下划线来解决命名冲突:
>>> def make_object(name, class):
SyntaxError: "invalid syntax"
>>> def make_object(name, class_):
... pass
总之,单个末尾下划线(后缀)是一个约定,用来避免与Python关键字产生命名冲突。 PEP 8解释了这个约定。
双前导下划线:__var
双下划线前缀会导致Python解释器重写属性名称,以避免子类中的命名冲突。
名称修饰:- 解释器更改变量的名称,以便在类被扩展的时候不容易产生冲突。
class Test:
def __init__(self):
self.foo = 11
self._bar = 23
self.__baz = 23
让我们用内置的dir()函数来看看这个对象的属性:
>>> t = Test()
>>> dir(t)
['_Test__baz', '__class__', '__delattr__', '__dict__', '__dir__',
'__doc__', '__eq__', '__format__', '__ge__', '__getattribute__',
'__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__',
'__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
'__setattr__', '__sizeof__', '__str__', '__subclasshook__',
'__weakref__', '_bar', 'foo']
注意__baz变成了 _Test__baz
作者:地球的外星人君
链接:https://zhuanlan.zhihu.com/p/36173202
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
让我们创建另一个扩展Test类的类,并尝试重写构造函数中添加的现有属性:
class ExtendedTest(Test):
def __init__(self):
super().__init__()
self.foo = 'overridden'
self._bar = 'overridden'
self.__baz = 'overridden'
现在,你认为foo,_bar和__baz的值会出现在这个ExtendedTest类的实例上吗? 我们来看一看:
>>> t2 = ExtendedTest()
>>> t2.foo
'overridden'
>>> t2._bar
'overridden'
>>> t2.__baz
AttributeError: "'ExtendedTest' object has no attribute '__baz'"
等一下,当我们尝试查看t2 .__ baz的值时,为什么我们会得到AttributeError? 名称修饰被再次触发了! 事实证明,这个对象甚至没有__baz属性:
>>> dir(t2)
['_ExtendedTest__baz', '_Test__baz', '__class__', '__delattr__',
'__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__',
'__getattribute__', '__gt__', '__hash__', '__init__', '__le__',
'__lt__', '__module__', '__ne__', '__new__', '__reduce__',
'__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__',
'__subclasshook__', '__weakref__', '_bar', 'foo', 'get_vars']
正如你可以看到__baz变成_ExtendedTest__baz以防止意外修改:
>>> t2._ExtendedTest__baz
'overridden'
但原来的_Test__baz还在:
>>> t2._Test__baz
42
双下划线名称修饰对程序员是完全透明的。 下面的例子证实了这一点:
class ManglingTest:
def __init__(self):
self.__mangled = 'hello'
def get_mangled(self):
return self.__mangled
>>> ManglingTest().get_mangled()
'hello'
>>> ManglingTest().__mangled
AttributeError: "'ManglingTest' object has no attribute '__mangled'"
名称修饰是否也适用于方法名称? 是的,也适用。名称修饰会影响在一个类的上下文中,以两个下划线字符("dunders")开头的所有名称:
class MangledMethod:
def __method(self):
return 42
def call_it(self):
return self.__method()
>>> MangledMethod().__method()
AttributeError: "'MangledMethod' object has no attribute '__method'"
>>> MangledMethod().call_it()
42
这是另一个也许令人惊讶的运用名称修饰的例子:
_MangledGlobal__mangled = 23
class MangledGlobal:
def test(self):
return __mangled
>>> MangledGlobal().test()
23
双前导和末尾下划线:__var__
也许令人惊讶的是,如果一个名字同时以双下划线开始和结束,则不会应用名称修饰。 由双下划线前缀和后缀包围的变量不会被Python解释器修改:
class PrefixPostfixTest:
def __init__(self):
self.__bam__ = 42
>>> PrefixPostfixTest().__bam__
42
Python保留了有双前导和双末尾下划线的名称,用于特殊用途。
__init__是用来在初始化类的对象时被调用,同时可以传入一些参数。
__call__用来在调用该对象时被触发。
【表格来自https://blog.csdn.net/linglongbayinhe/article/details/84848599】
| 魔法方法 | 含义 |
|---|---|
| - | 基本的魔法方法 |
| __ new__(cls[, …]) |
1. __ new__ 是在一个对象实例化的时候所调用的第一个方法 2. 它的第一个参数是这个类,其他的参数是用来直接传递给 __ init__ 方法 3. __ new__ 决定是否要使用该 __ init__ 方法,因为 __ new__ 可以调用其他类的构造方法或者直接返回别的实例对象来作为本类的实例,如果 __ new__ 没有返回实例对象,则 __ init__ 不会被调用 4. __ new__ 主要是用于继承一个不可变的类型比如一个 tuple 或者 string |
| __ init__(self[, …]) | 构造器,当一个实例被创建的时候调用的初始化方法 |
| __ del__(self) | 析构器,当一个实例被销毁的时候调用的方法 |
| __ call__(self[, args…]) | 允许一个类的实例像函数一样被调用:x(a, b) 调用 x.__ call__(a, b) |
| __ len__(self) | 定义当被 len() 调用时的行为 |
| __ repr__(self) | 定义当被 repr() 调用时的行为 |
| __ str__(self) | 定义当被 str() 调用时的行为 |
| __ bytes__(self) | 定义当被 bytes() 调用时的行为 |
| __ hash__(self) | 定义当被 hash() 调用时的行为 |
| __ bool__(self) | 定义当被 bool() 调用时的行为,应该返回 True 或 False |
| __ format__(self, format_spec) | 定义当被 format() 调用时的行为 |
| - | 有关属性 |
| __ getattr__(self, name) | 定义当用户试图获取一个不存在的属性时的行为 |
| __ getattribute__(self, name) | 定义当该类的属性被访问时的行为 |
| __ setattr__(self, name, value) | 定义当一个属性被设置时的行为 |
| __ delattr__(self, name) | 定义当一个属性被删除时的行为 |
| __ dir__(self) | 定义当 dir() 被调用时的行为 |
| __ get__(self, instance, owner) | 定义当描述符的值被取得时的行为 |
| __ set__(self, instance, value) | 定义当描述符的值被改变时的行为 |
| __ delete__(self, instance) | 定义当描述符的值被删除时的行为 |
| - | 比较操作符 |
| __ lt__(self, other) | 定义小于号的行为:x < y 调用 x.__ lt__(y) |
| __ le__(self, other) | 定义小于等于号的行为:x <= y 调用 x.__ le__(y) |
| __ eq__(self, other) | 定义等于号的行为:x == y 调用 x.__ eq__(y) |
| __ ne__(self, other) | 定义不等号的行为:x != y 调用 x.__ ne__(y) |
| __ gt__(self, other) | 定义大于号的行为:x > y 调用 x.__ gt__(y) |
| __ ge__(self, other) | 定义大于等于号的行为:x >= y 调用 x.__ ge__(y) |
| - | 算数运算符 |
| __ add__(self, other) | 定义加法的行为:+ |
| __ sub__(self, other) | 定义减法的行为:- |
| __ mul__(self, other) | 定义乘法的行为:* |
| __ truediv__(self, other) | 定义真除法的行为:/ |
| __ floordiv__(self, other) | 定义整数除法的行为:// |
| __ mod__(self, other) | 定义取模算法的行为:% |
| __ divmod__(self, other) | 定义当被 divmod() 调用时的行为 |
| __ pow__(self, other[, modulo]) | 定义当被 power() 调用或 ** 运算时的行为 |
单下划线:_
按照习惯,有时候单个独立下划线是用作一个名字,来表示某个变量是临时的或无关紧要的。
例如,在下面的循环中,我们不需要访问正在运行的索引,我们可以使用“_”来表示它只是一个临时值:
>>> for _ in range(32):
... print('Hello, World.')
在下面的代码示例中,我将汽车元组拆分为单独的变量,但我只对颜色和里程值感兴趣。 但是,为了使拆分表达式成功运行,我需要将包含在元组中的所有值分配给变量。 在这种情况下,“_”作为占位符变量可以派上用场:
>>> car = ('red', 'auto', 12, 3812.4)
>>> color, _, _, mileage = car
>>> color
'red'
>>> mileage
3812.4
>>> _
12
除了用作临时变量之外,“_”是大多数Python REPL中的一个特殊变量,它表示由解释器评估的最近一个表达式的结果。
这样就很方便了,比如你可以在一个解释器会话中访问先前计算的结果,或者,你是在动态构建多个对象并与它们交互,无需事先给这些对象分配名字:
>>> 20 + 3
23
>>> _
23
>>> print(_)
23
>>> list()
[]
>>> _.append(1)
>>> _.append(2)
>>> _.append(3)
>>> _
[1, 2, 3]
https://pic3.zhimg.com/v2-cbc5c6037101c7d33cf0acd9f00a8cfa_b.jpg

python any,call,init,下划线知识汇总的更多相关文章
- python python中那些双下划线开头的那些函数都是干啥用用的
1.写在前面 今天遇到了__slots__,,所以我就想了解下python中那些双下划线开头的那些函数都是干啥用用的,翻到了下面这篇博客,看着很全面,我只了解其中的一部分,还不敢乱下定义. 其实如果足 ...
- python 里面的单下划线与双下划线的区别
python 里面的单下划线与双下划线的区别 Python 用下划线作为变量前缀和后缀指定特殊变量. _xxx 不能用'from moduleimport *'导入 __xxx__ 系统定义名字 __ ...
- python中那些双下划线开头得函数和变量--转载
Python中下划线---完全解读 Python 用下划线作为变量前缀和后缀指定特殊变量 _xxx 不能用'from module import *'导入 __xxx__ 系统定义名字 __x ...
- Python里的单下划线,双下划线,以及前后都带下划线的意义
Python里的单下划线,双下划线,以及前后都带下划线的意义: 单下划线如:_name 意思是:不能通过from modules import * 导入,如需导入需要:from modules imp ...
- python中那些双下划线开头得函数和变量
Python中下划线---完全解读 Python 用下划线作为变量前缀和后缀指定特殊变量 _xxx 不能用’from module import *’导入 __xxx__ 系统定义名字 __x ...
- python中有两个下划线__的是内置方法,一个下划线_或者没有下划线的可能是属性,也可能是方法,也可能是类名
python中有两个下划线__的是内置方法,一个下划线_或者没有下划线的可能是属性,也可能是方法,也可能是类名,如果在类中定义的就是类的私有成员. >>> dir(__builtin ...
- 【编程开发】Python隐藏属性——使用双下划线标识私有属性,外部不可直接访问
from:https://zhuanlan.zhihu.com/p/30553607 小编在最初使用上Python之后,就一发不可收拾,人生苦短.我用Python,不光是因为其优雅简洁, ...
- python中的单下划线和双下划线意义和作用
Python中并没有真正意义上的“私有”,类的属性的的可见性取决于属性的名字(这里的属性包括了函数).例如,以单下划线开头的属性(例如_spam),应被当成API中非公有的部分(但是注意,它们仍然可以 ...
- Python 的类的下划线命名有什么不同?
1. 以一个下划线开头的命名 ,如_getFile2. 以两个下划线开头的命名 ,如__filename3. 以两个下划线开头和结尾的命名,如 __init__()4. 其它 单下划线前缀的 ...
随机推荐
- centos7源码编译安装LNMP+ZABBIX4.0LTS(1)——nginx
环境:192.168.117.132--zabbix server192.168.117.133--zabbix proxy 安装路径为/zabbix 安装nginx 1.安装包下载http://ng ...
- webmagic源码浅析
webmagic简介 webmagic可以说是中国传播度最广的Java爬虫框架,https://github.com/code4craft/webmagic,阅读相关源码,获益良多.阅读作者博客[代码 ...
- 渗透测试之nmap
一,功能介绍 Nmap是网络连接端口扫描软件,用来扫描网上电脑开放的哪些连接端口,并且确定哪些服务运行在哪些端口连接,推断是哪个操作系统,他是网络管理员必备的软件之一,以及用于评估网络系统安全. 二, ...
- ATOM基础教程一使用前端插件emmet(16)
emmet简介 http://blog.csdn.net/zsl10/article/details/51956791 emmet的前身是Zen coding,从事Web前端开发的工程师对该插件并不陌 ...
- Mybatis---04Mybatis配置文件浅析(二)
本文参考:https://www.cnblogs.com/yulinfeng/p/5991170.html 1.typeHandlers:类型处理器,设置预处理语句(PreparedStatement ...
- AtCoder Grand Contest 013D: Piling Up 题解
题意简化: [luogu] Piling Up 一开始有n个颜色为黑白的球,但不知道黑白色分别有多少,m次操作,每次先拿出一个球,再放入黑白球各一个,再拿出一个球,最后拿出的球按顺序排列会形成一个颜色 ...
- .NET CORE 下如何使用国产数据库进行 开发
主流国产数据库 随着贸易战的升级 ,自主研发和知识产权也是一个大的趋势,达梦和人大金仓是国产数据库中比较主流的 1.达梦数据库 更接近Oracle,更偏向自主研发,对开发人员友好度不如金仓 达梦公司在 ...
- APIview的使用
大牛博客: h'ttp://www.cnblogs.com/xiaonq/p/10124104.html 1.ModelViewSet 是对 APIView 封装 2.ModelSerializer ...
- 从入门到掌握 - 系统学习shell语言
简介 什么是 shell Shell是一种程序或命令行解释程序,用于解释用户直接输入的用户命令或从文件中读取的用户命令,然后将 它们传递给操作系统以进行操作或处理.要注意,这个过程是解释而不编译脚本, ...
- P2966 [USACO09DEC]Cow Toll Paths G
题意描述 Cow Toll Paths G 这道题翻译的是真的不错,特别是第一句话 给定一张有 \(n\) 个点 \(m\) 条边的无向图,每条边有边权,每个点有点权. 两点之间的路径长度为所有边权 ...