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. 其它 单下划线前缀的 ...
随机推荐
- go 下载图片
package main import ( "net/http" "fmt" "io/ioutil" "strings" ...
- centos8安装redis
一,下载: 1,下载页面: https://redis.io/ 2,下载 [root@localhost source]# wget http://download.redis.io/releases ...
- centos8安装java jdk 13
一,查看本地centos的版本 [root@localhost lib]# cat /etc/redhat-release CentOS Linux release 8.1.1911 (Core) 说 ...
- centos8平台使用wkhtmltopdf实现html网页转pdf
一,wkhtmltopdf的用途 wkhtmltopdf可以直接把任何一个可以在浏览器中浏览的网页直接转换成一个pdf 说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnb ...
- Hibernate关系映射之many-to-many(多对多)
在表设计中,我们一般都会考虑表与表之间的关系,现在我来介绍一下表与表之间的几种对应关系many-to-many 多对多 比如一个用户可以有多种角色 一种角色可以对用多个不同的用户所以角色和用户之间的关 ...
- WSL2和CUDA踩坑
WSL2和CUDA踩坑 WSL2里可以直接跑cuda了, 目前(2020年10月) 功能可用, 但bug很多, 不够完善 1. 安装 主要参考: https://docs.nvid ...
- 十年老苹果(A1286)强升Catalina及Win10踩坑记(续)
背景 自上次发布十年老苹果(A1286)强升Catalina及Win10踩坑记以来,因为后半部分-----系统安装上的细节描述过于简略,一些朋友在安装过程中总是又遇到坑,由此特意详述这一过程,让园友少 ...
- IntentService下载任务
onHandleIntent开启一个线程按顺序处理任务,不适合做大量任务 public class MainActivity extends AppCompatActivity { protected ...
- 欧拉计划第十一题--java实现
先做个说明,里面所有的题都是我自己写的解题报告,由于我的能力有限,是个刚学java的小白,有很多不足的地方,还望各位大佬不奢赐教,谢谢! Largest product in a grid In th ...
- CentOS 7 搭建 Ceph 集群(nautilus 版本)
搭建 Ceph 分布式集群( nautilus 版本 ) 一.服务器环境说明 主机名 角色 IP地址 ceph-admin ceph-deploy 192.168.92.21 ceph-node1 m ...