美文网首页
旧式类 vs. 新式类(二)

旧式类 vs. 新式类(二)

作者: import_hello | 来源:发表于2018-09-23 09:55 被阅读0次

    转载须注明出处:简书@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

    相关文章

      网友评论

          本文标题:旧式类 vs. 新式类(二)

          本文链接:https://www.haomeiwen.com/subject/hlxfoftx.html