Skip to content

特殊函数

类装饰器

@staticmethod

将方法转换为静态方法。

静态方法不会收到隐式的第一个参数。要声明一个静态方法,习惯用法如下:

python
class C:
    @staticmethod
    def f(arg1, arg2, ...):
        ...

它可以在类(如 C.f())或实例(如 C().f())上调用。

@classmethod

将方法转换为类方法。

类方法将类作为第一个参数接收(隐式的),就像实例方法接收实例一样。为了声明一个类方法,习惯用法如下:

python
class C:
    @classmethod
    def f(mcs, arg1, arg2, ...):
        ...

注意:类方法和静态方法不是一个概念

@property

python
class property(fget=None, fset=None, fdel=None, doc=None)

返回一个 property 属性。

fget 是获取属性值的函数。fset 是用于设置属性值的函数。fdel 是删除属性值时会调用的函数。doc 为该属性创建一个文档字符串。

典型的用法是定义一个托管属性 x

python
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.")

如果 cC 的一个实例,c.x 将调用 getxc.x = value 将调用 setxdel c.x 将调用 delx

如果给定,doc 将是 property 属性的文档字符串。否则,该属性将复制 fget 的文档字符串(如果存在)。这使得使用 property()

作为装饰器可以轻松创建只读属性:

python
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 对象具有可用作装饰器的 gettersetterdeleter 方法,这些方法创建属性的副本并将相应的存取器函数设置为装饰函数。这可以用一个例子来解释:

python
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 对象也具有与构造函数参数相对应的属性 fgetfsetfdel

特殊函数

iter

python
iter(object[, sentinel])

返回一个迭代器对象。根据第二个参数是否存在,第一个参数的解释有所不同。如果没有第二个参数,object 必须是支持迭代协议(__iter__() 方法)的集合对象,或者它必须支持序列协议(整数参数从 0 开始的 __getitem__() 方法)。如果它不支持这两种协议,则会引发 TypeError。如果给出了第二个参数 sentinel,那么 object 必须是可调用的对象。在这种情况下创建的迭代器将调用没有参数的 object,以便对其 __next__() 方法进行调用;如果返回的值等于 sentinel,则会触发StopIteration,否则将返回该值。

第二种形式的 iter() 的一个例子是按行读取文件,直到到达某一行。以下示例读取文件,直到 readline() 方法返回空字符串:

python
with open('mydata.txt') as fp:
    for line in iter(fp.readline, ''):
        process_line(line)

next

python
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 中恢复。

python
>>> 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

python
class slice(stop)
class slice(start, stop[, step])

返回表示由 range(start, stop, step) 指定的一组索引的切片对象。startstep 参数默认为 None。切片对象具有只读数据属性 startstopstep,它们只返回参数值(或它们的默认值)。他们没有其他明确的功能;然而,它们被 Numerical Python 和其他第三方扩展使用。当使用扩展索引语法时,也会生成切片对象。例如:a[start:stop:step]a[start:stop, i]

python
>>> 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() 会根据主机的位宽截断返回值。

python
>>> class A:
>>>     pass

>>> a = A()

>>> hash(a)
>>> 1552656422630569496

>>> class A:
>>>     def __hash__(self):
>>>         return 11111111111
>>>
>>>

>>> a = A()

>>> hash(a)
>>> 11111111111

format

python
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__() 方法)的对象。