python 一切皆物件

2021-07-07 06:43:05 字數 2157 閱讀 3059

在python中有一句話「一切皆物件」,其實在剛開始接觸python的時候對這句話完全不理解,即使是看完了python基礎教程也沒有很好的理解這句話的含義。直到看了python的原始碼才對這部分有了更深入的理解。我的入門指導書是《python原始碼剖析深度探索動態語言核心技術》。

在python中下列語句其實都是乙個共同點:
i = 1

s = "abcde"

deffoo

():pass

class

c(object):

pass

instance = c()

l = [1,2]

t = (1,2)

他們在python直譯器中執行的時候,都會在堆中新建了乙個物件,然後把新建的物件繫結到變數名上。

i = 1              -----新建乙個pyintobject物件,然後繫結到i上

s = "abcde" -----新建乙個pystringobject物件,繫結到s上

deffoo

():pass -----新建乙個pyfunctionobject物件, 繫結到foo上

class

c(object):

pass -----新建乙個類物件,繫結到c上

instance = c() -----新建乙個例項物件,繫結到instance上

l = [1,2] -----新建乙個pylistobject物件,繫結到l上

t = (1,2) -----新建乙個pytupleobject物件,繫結到t上

但是有一些是例外,他們就是python中的內建物件,比如pyint_type,pystring_type,pylist_type,他們都是全域性變數,在**中已經靜態的初始化了這些型別的實現,但是這些全域性變數都還要通過pytype_ready的初始化才算真正初始化完成。

好吧,既然都是物件,那麼class物件的建立(如上面例子中的c)和例項物件(如上面例子中的instance)的建立有什麼不同呢?

個人覺得是完成了對class物件的建立控制,而例項物件的建立主要是通過控制的。下面這張圖就比較好的體現了type和object之間的關係,是所有類的metaclass,而新的class都是繼承於,是所有類的父類,而a就是 class a的例項。

當然在**中我們也可以控制物件建立的過程:

class

meta

(type):

def__getattribute__

(*args):

print

"metaclass getattribute invoked"

return type.__getattribute__(*args)

class

c(object):

__metaclass__ = meta

def__new__

(cls):

ifnot hasattr(cls, 'instance'):

cls.instance = super(c, cls).__new__(cls)

return cls.instance

def__getattribute__

(*args):

print

"class getattribute invoked"

return super(c, self).__getattribute__(*args)

在**中__metaclass__實現了對class建立的控制,而__new__實現了對例項建立的控制,因此__new__方法應是算是class級別的。還有乙個__init__方法是對每個例項的初始化,所以這個方法應該算是instance級別的。

Python 一切皆物件

學習筆記 class dxiang def ff self print 這是物件的方法 one方法 def common canshu 定義乙個方法在類之外 print 這是乙個普通的方法的引數 canshu common 2 呼叫函式方法 dxiang.method common 類的方法增加乙個...

一切皆物件

description 一切都是物件 everything is an object。所以,現在定義乙個類thing,來描述世界上所有有名字的事物。該類只有建構函式 拷貝建構函式和析構函式,並具有乙個字串資料成員來儲存其名字。input 輸入只有1行,是乙個沒有空白符的字串。output 見樣例。s...

python中一切皆物件

動態語言和靜態語言的區別 函式和類也是物件,屬於python的一等公民 特性 定義乙個函式,並把這個函式賦值給乙個變數,此時這個變數可以作為乙個函式使用 defask name bobby print name my func ask my func bobby 定義乙個類,同樣可以使用這樣的操作,...