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

假設(shè)有一個類Foo:

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

然后實例化

f = Foo(1, y=2)

執(zhí)行過程為

  • Foo(*args, **kwargs) 首先調(diào)用 Foo.__call__(*args, **kwargs),如果沒有__call__則調(diào)用tp_call屬性(解釋器內(nèi)置,C語言)
  • 因為 Foo 是object的子類,所以 Foo.__call__(*args, **kwargs) 調(diào)用的是 object.tp_call(Foo, *args,**kwargs)
  • object.tp_call(Foo, *args, **kwargs) 調(diào)用的是 object.__new__(Foo, *args, **kwargs),然后返回了 obj
  • obj 被 obj.__init__(*args, **kwargs) 初始化
  • 最后 obj 就被返回了

同時,如果子類中未定義__init__,則父類的__init__方法會在子類的各屬性及方法初始化后再調(diào)用,例如先定義基類

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評論 19 139
  • 兩本不錯的書: 《Python參考手冊》:對Python各個標(biāo)準(zhǔn)模塊,特性介紹的比較詳細(xì)。 《Python核心編程...
    靜熙老師哈哈哈閱讀 3,441評論 0 80
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,626評論 18 399
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 2,032評論 0 9
  • 編寫高效代碼的兩個基本原則:不要做冗余的工作。盡量避免次數(shù)過多的內(nèi)存分配操作 數(shù)據(jù)結(jié)構(gòu)的選擇 正確的選擇合適的數(shù)據(jù)...
    凱玲之戀閱讀 482評論 0 1

友情鏈接更多精彩內(nèi)容