特殊函数
类装饰器
@staticmethod
将方法转换为静态方法。
静态方法不会收到隐式的第一个参数。要声明一个静态方法,习惯用法如下:
class C:
@staticmethod
def f(arg1, arg2, ...):
...
它可以在类(如 C.f()
)或实例(如 C().f()
)上调用。
@classmethod
将方法转换为类方法。
类方法将类作为第一个参数接收(隐式的),就像实例方法接收实例一样。为了声明一个类方法,习惯用法如下:
class C:
@classmethod
def f(mcs, arg1, arg2, ...):
...
注意:类方法和静态方法不是一个概念
@property
class property(fget=None, fset=None, fdel=None, doc=None)
返回一个 property
属性。
fget
是获取属性值的函数。fset
是用于设置属性值的函数。fdel
是删除属性值时会调用的函数。doc
为该属性创建一个文档字符串。
典型的用法是定义一个托管属性 x
:
class C:
def __init__(self):
self._x = None
def getx(self):
return self._x
def setx(self, value):
self._x = value
def delx(self):
del self._x
x = property(getx, setx, delx, "I'm the 'x' property.")
如果 c
是 C
的一个实例,c.x
将调用 getx
,c.x = value
将调用 setx
,del c.x
将调用 delx
。
如果给定,doc
将是 property
属性的文档字符串。否则,该属性将复制 fget
的文档字符串(如果存在)。这使得使用 property()
作为装饰器可以轻松创建只读属性:
class Parrot:
def __init__(self):
self._voltage = 100000
@property
def voltage(self):
"""Get the current voltage."""
return self._voltage
@property
修饰器将 voltage()
方法转换为具有相同名称的只读属性的 getter
,并将 voltage
的文档字符串设置为 “Get the current voltage.”
。
property
对象具有可用作装饰器的 getter
,setter
和 deleter
方法,这些方法创建属性的副本并将相应的存取器函数设置为装饰函数。这可以用一个例子来解释:
class C:
def __init__(self):
self._x = None
@property
def x(self):
"""I'm the 'x' property."""
return self._x
@x.setter
def x(self, value):
self._x = value
@x.deleter
def x(self):
del self._x
此代码与第一个示例完全等效。请务必为附加函数提供与原始 property
相同的名称(当前为 x
)。
返回的 property
对象也具有与构造函数参数相对应的属性 fget
,fset
和 fdel
。
特殊函数
iter
iter(object[, sentinel])
返回一个迭代器对象。根据第二个参数是否存在,第一个参数的解释有所不同。如果没有第二个参数,object
必须是支持迭代协议(__iter__()
方法)的集合对象,或者它必须支持序列协议(整数参数从 0 开始的 __getitem__()
方法)。如果它不支持这两种协议,则会引发 TypeError
。如果给出了第二个参数 sentinel
,那么 object
必须是可调用的对象。在这种情况下创建的迭代器将调用没有参数的 object
,以便对其 __next__()
方法进行调用;如果返回的值等于 sentinel,则会触发StopIteration
,否则将返回该值。
第二种形式的 iter()
的一个例子是按行读取文件,直到到达某一行。以下示例读取文件,直到 readline()
方法返回空字符串:
with open('mydata.txt') as fp:
for line in iter(fp.readline, ''):
process_line(line)
next
next(iterator[, default])
通过调用 __next__()
方法从 iterator
中检索下一个 item
。如果给出了 default
,则在迭代器耗尽时返回它,否则引发 StopIteration
。
repr(object)
返回一个包含对象可打印表示的字符串。对于许多类型,此函数尝试返回一个字符串,该字符串在传递给 eval()
时会产生一个具有相同值的对象,否则该表示是一个用尖括号括起来的字符串,其中包含对象类型的名称以及其他信息包括对象的名称和地址。一个类可以通过定义 __repr__()
方法来控制此函数为其实例返回的内容。
callable(object)
如果 object
参数可调用,则返回 True
,否则返回 False
。如果返回 true
,调用失败仍然是可能的,但如果是 false
,调用 object
将永远不会成功。请注意,类是可调用的(调用一个类返回一个新的实例); 如果类有一个 __call__()
方法,则实例可以被调用。
3.2版本中的新功能:此功能在 Python 3.0 中首先被删除,然后在 Python 3.2 中恢复。
>>> a = 1
>>> callable(a)
>>> a = 1
>>> callable(a)
False
>>> def func():
... pass
...
>>> callable(func)
True
>>> a = A()
>>> callable(a)
False
>>> class A:
... def __call__(self, *args, **kwargs):
... pass
...
>>> a = A()
>>> callable(a)
True
slice
class slice(stop)
class slice(start, stop[, step])
返回表示由 range(start, stop, step)
指定的一组索引的切片对象。start
和 step
参数默认为 None
。切片对象具有只读数据属性 start
、stop
和 step
,它们只返回参数值(或它们的默认值)。他们没有其他明确的功能;然而,它们被 Numerical Python 和其他第三方扩展使用。当使用扩展索引语法时,也会生成切片对象。例如:a[start:stop:step]
或 a[start:stop, i]
。
>>> a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> s = slice(1, 8, 2)
>>> a[s]
[1, 3, 5, 7]
hash(object)
返回对象的散列值(如果有)。哈希值是整数。它们用于在字典查找期间快速比较字典键。比较相等的数值具有相同的散列值(即使它们具有不同的类型,就像 1 和 1.0 一样)。
对于具有自定义
__hash__()
方法的对象,请注意,hash()
会根据主机的位宽截断返回值。
>>> class A:
>>> pass
>>> a = A()
>>> hash(a)
>>> 1552656422630569496
>>> class A:
>>> def __hash__(self):
>>> return 11111111111
>>>
>>>
>>> a = A()
>>> hash(a)
>>> 11111111111
format
format(value[, format_spec])
将值转换为 “格式化” 表示,由 format_spec
控制。 format_spec
的解释将取决于 value
参数的类型,不过,大多数内置类型都使用标准格式化语法:格式化规范迷你语言。
默认 format_spec
是一个空字符串,通常与调用 str(value)
的效果相同。
对 format(value, format_spec)
的调用被转换为 type(value).__format__(value, format_spec)
,它在搜索 value 的 __format__()
方法时绕过实例字典。如果方法搜索到达 object
并且 format_spec
非空,或者 format_spec
或返回值不是字符串,则会引发 TypeError
异常。
在 version 3.4 中:如果 format_spec
不是空字符串,则 object().__format__(format_spec)
会引发 TypeError
。
help([object])
调用内置的帮助系统。 (此功能用于交互式使用。)如果未提供参数,则交互式帮助系统将在解释器控制台上启动。如果参数是一个字符串,那么该字符串将被查找为模块,函数,类,方法,关键字或文档主题的名称,并在控制台上打印帮助页面。如果参数是任何其他类型的对象,则会生成对象上的帮助页面。
reversed(seq)
返回一个反向迭代器。seq
必须是具有 __reversed__()
方法或支持序列协议( __len__()
方法和整数参数从 0 开始的 __getitem__()
方法)的对象。