上一篇文章:Python 标准库 —5、内置函数(P-K-R)
下一篇文章:
内置函数:
57. class set([iterable])
返回一个新的 set 对象,可以选择带有从 iterable 获取的元素。set 是一个内置类型。请查看 set 和 集合类型 — set, frozenset 获取关于这个类的文档。
有关其他容器请参看内置的 frozenset, list, tuple 和 dict 类,以及 collections 模块。
58. setattr(object, name, value)
此函数与 getattr() 两相对应。其参数为一个对象、一个字符串和一个任意值。字符串指定一个现有属性或者新增属性。函数会将值赋给该属性,只要对象允许这种操作。例如,setattr(x, ‘foobar’, 123) 等价于 x.foobar = 123。
59. class slice(stop)
class slice(start, stop[, step])
返回一个表示由 range(start, stop, step) 所指定索引集的 slice 对象。其中 start 和 step 参数默认为 None。切片对象具有仅会返回对应参数值(或其默认值)的只读数据属性 start, stop 和 step。它们没有其他的显式功能;不过它们会被 NumPy 以及其他第三方扩展所使用。切片对象也会在使用扩展索引语法时被生成。例如: a[start:stop:step] 或 a[start:stop, i]。请参阅 itertools.islice() 了解返回迭代器的一种替代版本。
60. sorted(iterable, *, key=None, reverse=False)
根据 iterable 中的项返回一个新的已排序列表。
具有两个可选参数,它们都必须指定为关键字参数。
key 指定带有单个参数的函数,用于从 iterable 的每个元素中提取用于比较的键 (例如 key=str.lower)。默认值为 None (直接比较元素)。
reverse 为一个布尔值。如果设为 True,则每个列表元素将按反向顺序比较进行排序。
使用 functools.cmp_to_key() 可将老式的 cmp 函数转换为 key 函数。
内置的 sorted() 确保是稳定的。如果一个排序确保不会改变比较结果相等的元素的相对顺序就称其为稳定的 — 这有利于进行多重排序(例如先按部门、再按薪级排序)。
有关排序示例和简要排序教程,请参阅 排序指南。
61. @staticmethod
将方法转换为静态方法。
静态方法不会接收隐式的第一个参数。要声明一个静态方法,请使用此语法
class C:
@staticmethod
def f(arg1, arg2, ...): ...
@staticmethod 这样的形式称为函数的 decorator — 详情参阅 函数定义。
静态方法的调用可以在类上进行 (例如 C.f()) 也可以在实例上进行 (例如 C().f())。Python 中的静态方法与 Java 或 C ++ 中的静态方法类似。另请参阅 classmethod(),用于创建备用类构造函数的变体。
像所有装饰器一样,也可以像常规函数一样调用 staticmethod,并对其结果执行某些操作。比如某些情况下需要从类主体引用函数并且您希望避免自动转换为实例方法。对于这些情况,请使用此语法:
class C:
builtin_open = staticmethod(open)
想了解更多有关静态方法的信息,请参阅 标准类型层级结构。
62. class str(object=”)
class str(object=b”, encoding=’utf-8′, errors=’strict’)
返回一个 str 版本的 object。有关详细信息,请参阅 str()。
str 是内置字符串 class。更多关于字符串的信息查看 文本序列类型 — str。
63. sum(iterable[, start])
从 start 开始自左向右对 iterable 中的项求和并返回总计值。start 默认为 0。iterable 的项通常为数字,开始值则不允许为字符串。
对某些用例来说,存在 sum() 的更好替代。拼接字符串序列的更好更快方式是调用 ”.join(sequence)。要以扩展精度对浮点值求和,请参阅 math.fsum()。要拼接一系列可迭代对象,请考虑使用 itertools.chain()。
64. super([type[, object-or-type]])
返回一个代理对象,它会将方法调用委托给 type 指定的父类或兄弟类。这对于访问已在类中被重载的继承方法很有用。搜索顺序与 getattr() 所使用的相同,只是 type 指定的类型本身会被跳过。
type 的 mro 属性列出了 getattr() 和 super() 所使用的方法解析顺序。该属性是动态的,可以在继承层级结构更新的时候任意改变。
如果省略第二个参数,则返回的超类对象是未绑定的。如果第二个参数为一个对象,则 isinstance(obj, type) 必须为真值。如果第二个参数为一个类型,则 issubclass(type2, type) 必须为真值(这适用于类方法)。
super 有两个典型用例。
- 在具有单继承的类层级结构中,super 可用来引用父类而不必显式地指定它们的名称,从而令代码更易维护。这种用法与其他编程语言中 super 的用法非常相似。
- 第二个用例是在动态执行环境中支持协作多重继承。此用例为 Python 所独有,在静态编译语言或仅支持单继承的语言中是不存在的。这使得实现“菱形图”成为可能,在这时会有多个基类实现相同的方法。好的设计强制要求这种方法在每个情况下具有相同的调用签名(因为调用顺序是在运行时确定的,也因为该顺序要适应类层级结构的更改,还因为该顺序可能包含在运行时之前未知的兄弟类)。
对于以上两个用例,典型的超类调用看起来是这样的:
class C(B):
def method(self, arg):
super().method(arg)
# This does the same thing as:
# super(C, self).method(arg)
请注意 super() 是作为显式加点属性查找的绑定过程的一部分来实现的,例如 super().__getitem__(name)。它做到这一点是通过实现自己的 __getattribute__() 方法,这样就能以可预测的顺序搜索类,并且支持协作多重继承。对应地,super() 在像 super()[name] 这样使用语句或操作符进行隐式查找时则未被定义。
还要注意的是,除了零个参数的形式以外,super() 并不限于在方法内部傅和。两个参数的形式明确指定参数并进行相应的引用。零个参数的形式仅适用于类定义内部,因为编译器需要填入必要的细节以正确地检索到被定义的类,还需要为普通访问当前实例。
对于有关如何使用 super() 来如何设计协作类的实用建议,请参阅 使用 super() 的指南。
65. tuple([iterable])
虽然被称为函数,但 tuple 实际上是一个不可变的序列类型,参见在 元组 与 序列类型 — list, tuple, range 中的文档说明。
66. class type(object)
class type(name, bases, dict)
传入一个参数时,返回 object 的类型。返回值是一个 type 对象,通常与 object.__class__ 所返回的对象相同。
推荐使用 isinstance() 内置函数来检测对象的类型,因为它会考虑子类的情况。
传入三个参数时,返回一个新的 type 对象。这在本质上是 class 语句的一种动态形式。name 字符串即类名并且会成为 name 属性;bases 元组列出基类并且会成为 bases 属性;而 dict 字典为包含类主体定义的命名空间并且会被复制到一个标准字典成为 dict 属性。例如,下面两条语句会创建相同的 type 对象:
>>> class X:
... a = 1
...
>>> X = type('X', (object,), dict(a=1))
另请参阅 类型对象。
在 3.6 版更改: type 的子类如果未重载 type.__new__,将不再能使用一个参数的形式来获取对象的类型。
上一篇文章:Python 标准库 —5、内置函数(P-K-R)
下一篇文章: