Pytho实例化过程

实例化过程Cpython过程等价为

def __call__(obj_type, *args, **kwargs):
    obj = obj_type.__new__(*args, **kwargs)
    if obj is not None and issubclass(obj, obj_type):
        obj.__init__(*args, **kwargs)
    return obj

假设有一个类Foo:

class Foo(object):
    def __init__(self, x, y=0):
        self.x = x
        self.y = y

然后实例化

f = Foo(1, y=2)

执行过程为

  • Foo(*args, **kwargs) 首先调用 Foo.__call__(*args, **kwargs),如果没有__call__则调用tp_call属性(解释器内置,C语言)
  • 因为 Foo 是object的子类,所以 Foo.__call__(*args, **kwargs) 调用的是 object.tp_call(Foo, *args,**kwargs)
  • object.tp_call(Foo, *args, **kwargs) 调用的是 object.__new__(Foo, *args, **kwargs),然后返回了 obj
  • obj 被 obj.__init__(*args, **kwargs) 初始化
  • 最后 obj 就被返回了

同时,如果子类中未定义__init__,则父类的__init__方法会在子类的各属性及方法初始化后再调用,例如先定义基类

import math

class Structure1:
    # Class variable that specifies expected fields
    _fields = []

    def __init__(self, *args):
        if len(args) != len(self._fields):
            raise TypeError('Expected {} arguments'.format(len(self._fields)))
        # Set the arguments
        for name, value in zip(self._fields, args):
            setattr(self, name, value)

然后使你的类继承自这个基类

# Example class definitions
class Stock(Structure1):
    _fields = ['name', 'shares', 'price']

class Point(Structure1):
    _fields = ['x', 'y']

class Circle(Structure1):
    _fields = ['radius']

    def area(self):
        return math.pi * self.radius ** 2

使用这些类的示例均实例化成功:

>>> s = Stock('ACME', 50, 91.1)
>>> p = Point(2, 3)
>>> c = Circle(4.5)

参考http://liuliqiang.info/post/understanding-python-class-instantiation
参考Stackoverflow
参考Python Cookbook

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,544评论 19 139
  • 两本不错的书: 《Python参考手册》:对Python各个标准模块,特性介绍的比较详细。 《Python核心编程...
    静熙老师哈哈哈阅读 3,441评论 0 80
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 34,643评论 18 399
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 2,041评论 0 9
  • 编写高效代码的两个基本原则:不要做冗余的工作。尽量避免次数过多的内存分配操作 数据结构的选择 正确的选择合适的数据...
    凯玲之恋阅读 482评论 0 1

友情链接更多精彩内容