美文网首页
Pytho实例化过程

Pytho实例化过程

作者: 云影渐微 | 来源:发表于2017-07-24 21:14 被阅读0次

实例化过程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

相关文章

  • Pytho实例化过程

    实例化过程Cpython过程等价为 假设有一个类Foo: 然后实例化 执行过程为 Foo(*args, **kwa...

  • 魔法方法init和new

    继承自object的新式类才有new new至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Pytho...

  • __new__

    继承自object的新式类才有new new至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Pytho...

  • python 一图看懂各种类方法

    对象:是类实例化后的实体 实例化:创建对象的过程称为实例化,一般用:if __name__ == '__main_...

  • 实例化对象过程

    实例化对象过程 new关键字执行过程 进行类加载检查。当遇到一个new指令,首先检查能否在方法区的常量池中能否定位...

  • vue实例化过程

    https://www.cnblogs.com/gerry2019/p/12001661.html[https:/...

  • Chaincode实例化过程

    启动过程 启动Fabric网络 1.启动Orderer 2. 启动Peer 3.起动并进入cli容器 4.创建Ch...

  • JavaSE知识点6java实例化

    实例化 1概述对象(Object)又叫做实例(Instance),生成一个对象的过程又叫做实例化。*2 构造方法(...

  • Flask 模块启动源码分析

    通过flask启动脚本,实例化FlaskGroup类,实例化过程会配置routes、run、shell指令。然后通...

  • 设计模式之单例模式

    说明:只要实例化一次,超过一次的实例化过程会返回之前实例化的结果,而不会在内存中再次写入新的实例对象。----类似...

网友评论

      本文标题:Pytho实例化过程

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