python種方法 Python中的常用的

2021-10-19 21:45:45 字數 2151 閱讀 7173

__new__、__init__、__call__的介紹

在講到使用元類建立單例模式之前,比需了解__new__這個內建方法的作用,在上面講元類的時候我們用到了__new__方法來實現類的建立。然而我在那之前還是對__new__這個方法和__init__方法有一定的疑惑。因此這裡花點時間對其概念做一次了解和區分。

__new__ 建立新物件

__new__方法負責建立乙個例項物件,在物件被建立的時候呼叫該方法它是乙個類方法。__new__方法在返回乙個例項之後,會自動的呼叫__init__方法,對例項進行初始化。如果__new__方法不返回值,或者返回的不是例項,那麼它就不會自動的去呼叫__init__方法。

__init__ 例項化

__init__ 方法負責將該例項物件進行初始化,在物件被建立之後呼叫該方法,在__new__方法建立出乙個例項後對例項屬性進行初始化。__init__方法可以沒有返回值。

__call__ 呼叫

__call__方法其實和類的建立過程和例項化沒有多大關係了,定義了__call__方法才能被使用函式的方式執行。

例如:classa(object):def __call__(self):print "__call__ be called"a=a()

a()#輸出#__call__ be called

打個比方幫助理解:如果將建立例項的過程比作建乙個房子。

那麼class就是乙個房屋的設計圖,他規定了這個房子有幾個房間,每個人房間的大小朝向等。這個設計圖就是累的結構

__new__就是乙個房屋的框架,每個具體的房屋都需要先搭好框架後才能進行專修,當然現有了房屋設計才能有具體的房屋框架出來。這個就是從類到類例項的建立。

__init__就是裝修房子的過程,對房屋的牆面和地板等顏色材質的豐富就是它該做的事情,當然先有具體的房子框架出來才能進行裝飾了。這個就是例項屬性的初始化,它是在__new__出乙個例項後才能初始化。

__call__就是房子的**,有了固定**,才能被打**嘛(就是通過括號的方式像函式一樣執行)。

#coding:utf-8

classfoo(object):def __new__(cls, *args, **kwargs):#__new__是乙個類方法,在物件建立的時候呼叫

print "excute __new__"

return super(foo,cls).__new__(cls,*args,**kwargs)def __init__(self,value):#__init__是乙個例項方法,在物件建立後呼叫,對例項屬性做初始化

print "excute __init"self.value=value

f1= foo(1)printf1.value

f2= foo(2)printf2.value#輸出===:

excute __new__excute__initexcute__new__excute__init

#====可以看出new方法在init方法之前執行

子類如果重寫__new__方法,一般依然要呼叫父類的__new__方法。

classchild(foo):def __new__(cls, *args, **kwargs):return suyper(child, cls).__new__(cls, *args, **kwargs)

必須注意的是,類的__new__方法之後,必須生成本類的例項才能自動呼叫本類的__init__方法進行初始化,否則不會自動呼叫__init__.

classfoo(object):def __init__(self, *args, **kwargs):print "foo __init__"

def __new__(cls, *args, **kwargs):return object.__new__(stranger, *args, **kwargs)classstranger(object):def __init__(self,name):print "class stranger's __init__ be called"self.name=name

foo= foo("test")print type(foo) #

print foo.name #attributeerror: 'stranger' object has no attribute 'name'

#說明:如果new方法返回的不是本類的例項,那麼本類(foo)的init和生成的類(stranger)的init都不會被呼叫

執行python指令碼的幾種方法

linux有下列的幾種方法來執行python指令碼 注 我所用的python環境為 2.6 一.終端命令列下 python name.py 二.python環境中 若指令碼名稱為name.py,其內容為 a head b hehe print a,b 則使用 impport name 針對此種方法我...

Python呼叫C C 的種種方法

摘要 python是解釋性語言,底層就是用c實現的,所以用python呼叫c是很容易的,下面就總結一下各種呼叫的方法,給出例子,所有例子都在ubuntu9.10,python2.6下試過.1.python是解釋性語言,底層就是用c實現的,所以用python呼叫c是很容易的,下面就總結一下各種呼叫的方...

執行python指令碼的幾種方法

linux有下列的幾種方法來執行python指令碼 注 我所用的python環境為 2.6 一.終端命令列下 python name.py 二.python環境中 若指令碼名稱為name.py,其內容為 a head b hehe print a,b 則使用 impport name 針對此種方法我...