旧式类 vs. 新式类(二)

2018-09-23  本文已影响0人  import_hello

转载须注明出处:简书@Orca_J35

目录.png

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 like list and dict. 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
上一篇下一篇

猜你喜欢

热点阅读