目录.png转载须注明出处:简书@Orca_J35
3. New-Style
新式(New-style)在 Python 2.2 中被引入,将 "类(class)" 和 "类型(type)" 的概念进行了统一,也就是说在新式类中 "类(class)" 和 "类型(type)" 是同义词,两者并没有任何区别。所以,我们可将一个新式类(class)视作一个自定义类型(type)。因此,对于某个新式类的实例 x 而言,type(x)
的返回值与x.__class__
完全相同。
虽然 "类(class)" 和 "类型(type)" 是同义词,但我们通常会将术语 "类型(type)" 用于内置类型,而将术语 "类(class)" 用于自定义类。
>>> type("hello")
<class 'str'>
>>> # 通常我们会说字符串是str类型
>>>
>>> class NewCls(object):pass
>>> type(NewCls())
<class '__main__.NewCls'>
>>> NewCls().__class__
<class '__main__.NewCls'>
>>> # 通常我们会说NewCls()是NewCls类的实例,
>>> # 但本质上而言,新式类就是一个自定义类型,
>>> # 因此,我们同样可以说NewCls是其实例的类型,
3.1 新式类
new-style class (in Glossary of Python 2)
Any class which inherits from
object
. This includes all built-in types likelist
anddict
. Only new-style classes can use Python's newer, versatile features like__slots__
, descriptors, properties, and__getattribute__()
, class methods, and static methods.
对于新式类 NewCls 而言,其类型(或类)始终是 <type 'type'>
。由此可见,新式类统一由一个独立的内置类型实现,即 type (也称为 <type 'type'>
)。
>>> class NewCls(object):pass
>>> NewCls.__class__
<type 'type'>
>>> type(NewCls)
<type 'type'>
# 新式类NewCls是type的实例
>>> isinstance(NewCls, type)
True
a. type in Python
type 本身是继承自 object 的新式类(类型),其类型也是 type。Python 2 和 3 均包含 type 类型(类)。tips: 在 Python 2 中 types.TypeType 是 type 的别名。
>>> type(type)
<type 'type'>
>>> type.__bases__
(<type 'object'>,)
用户定义的新式类的类型均为 type,内置类型的类型也是 type。
>>> # 用户定义的新式类的类型均为 type
>>> class NewCls(object):pass
>>> type(NewCls)
<type 'type'>
>>> # 内置类型的类型也是 type
>>> type(int)
<type 'type'>
>>> type(list)
<type 'type'>
type 是新式类的元类,负责构造新式类:
>>> # type只能构造新式类,若第二参数为空,则默认继承object
>>> NewCls = type('X', tuple(), dict())
>>> NewCls.__class__
<type 'type'>
>>> NewCls.__bases__
(<type 'object'>,)
type 可以被继承,我们可以基于 type 派生自定义元类。
b. 三种等价定义方式
class New(object): pass
class New:
__metaclass__ = type
New = type('New', (), {})
3.2 新式实例
对于某个新式类的实例 x 而言,其类(或类型)始终是该新式类。不同于旧式类,新式类的实例不再由特定类型创建,而是由新式类自己创建。
>>> class NewCls(object):pass
>>> type(NewCls())
<class '__main__.NewCls'>
>>> NewCls().__class__
<class '__main__.NewCls'>
赞赏.jpg
网友评论