類(class)是一個使用者自訂類型,開發人員可以將其執行個體化以獲得執行個體(instance),執行個體表示這種類型的對象。在Python中,類就是對象,開發人員可以像對其他對象那樣處理函數,可以在調用函數時傳遞一個類作為參數,也可以返回一個類作為函數調用的結果。任何對象,即使是一個類對象,都有一個類型。在Python中,類型和類也都是第一類對象。類對象的類型也被稱為該類的元類(metaclass)。對象的行為主要是由該類對象的類型確定的。這也適用於類:類的行為也是主要由該類的元類確定的。
class語句
class語句是建立一個類對象最常用的方法。如下:
class classname(base_classes): statement(s)
classname是一個標識符。該標識符是一個在執行完class語句之後被綁定到類對象的變數。base_classes是一個使用逗號分隔的運算式序列,這些運算式的值必須是類對象。例如:
class C(B1,B2): #B1和B2都是類 statement(s)
最後,請注意,class語句並不直接建立新類的任何一個執行個體,而是定義了在以後調用這個類建立執行個體時,所有執行個體共有的屬性集(即類對象屬性)。
類對象屬性
通常可以通過將一個值綁定到類體中的一個標識符上來指定類對象的一個屬性(即類屬性)。例如:
class C1(object): x = 23print C1.x #print:23
類對象C1包含一個名為x的屬性,該屬性被綁定為值23。我們應該知道,在執行個體被建立時,任何類屬性都由該類的所有執行個體隱式共用。
類對象會隱式設定某些類屬性。屬性__name__是類名標識符字串。屬性__bases__是類的基類的類對象的元組。例如:
print C1.__name__, C1.__bases__ #print: C1, (<type ‘object’>)
類對象還包含一個屬性__dict__,這個屬性是該類的字典對象,被用來儲存所有其他屬性。對於任何類對象C、任何對象x,以及任何標識符S(除了__name__、__bases__和__dict__),C.S等於C.__dict__[‘S’]=x。例如:
C1.y = 45C1.__dict__['z']= 67print C1.y,C1z #print: 45, 67
執行個體
類的執行個體是一個帶有任意名稱的屬性的Python對象,開發人員可以綁定和引用這些屬性。要想建立一個類的執行個體,可以調用類對象,就像該對象是一個函數一樣。每個調用都將返回一個類型為該類的新執行個體:
anInstance = C1()
開發人員可以調用內建函數isinstance(I, C),並使用一個類對象作為參數C。如果對象I是類C或類C的任何子類的一個執行個體,則instance將返回True,否則返回False。
__init__
當一個類定義或繼承了一個名為__init__的方法時,調用該類對象將對新執行個體隱式執行__int__方法以執行任何需要的與執行個體相關的初始化。該調用中傳遞的參數必須對應於__init__的參數,除了參數self。例如:
class C6(objec): def __init__(self, n); self.x = n
建立類C6的一個執行個體:
anInstance = C6(42)
__init__的主要目的就是綁定,並因此建立新建立的執行個體的屬性。__init__方法不能返回一個值,否則,Python將引發一個TypeError異常。
對於任何執行個體z,z..__class__是z所屬的類對象,而z..__dict__是z用來儲存其他屬性的字典。例如:
print anInstance.__classs__.__name__, anInstance .__dict__ #print: C6, {'x' : 42}
對於任何執行個體z,任何對象x和任何標識符S(除了__classs和__dict__),z.S = x等於z.__dict__[‘S’] = x。例如:
z.y = 45z.__dict__['z'] = 67print z.y, z.z #print: 45, 67
__new__
每個新型累都有(或者繼承了)一個名為__new__的靜態方法。當開發人員調用C(*args, **kwds)來建立類C的一個執行個體時,Python將首先調用C.__new__(C,*args, **kwds)。Python使用__new__的傳回值x作為新建立的執行個體。然後,Python將調用C.__init__(x,*args, **kwds),但是只有在x確認是C的一個執行個體,或者C的任何一個子類時才會調用該方法。例如:語句x = C(23)等同於:
x = C.__new__(C, 23)if isinstance(x, C): type(x).__init__(x, 23)
object.__new__可以建立其接受為第一個參數的類的一個新的和未初始化的執行個體。如果這個類包含一個__init__方法,則該方法將忽略其他參數,但是,如果除了第一個參數,該方法還接受了其他參數,並且第一個參數的類不包含__init__方法,則該方法將引發一個異常。下面通過實現Singleton設計模式來示範上面內容。
class Singleton(object): ## @var __Instance __Instance = None @staticmethod def GetInstance(): if Singleton.__Instance == None: Singleton.__Instance = Singleton() return Singleton.__Instance def __new__(cls, *args, **kv): print "__new__" if Singleton.__Instance == None: Singleton.__Instance = object.__new__( cls ) print "Singleton.__Instance:", Singleton.__Instance return Singleton.__Instance def __init__(self, x): print "__init__" print "self:", self self.x = x print x def PrintX(self): print self.xanInstance = Singleton(23)anotherInstance = Singleton(32)
運行結果:
分析:
從上面運行結果我們可以看出,建立一個新執行個體時,先調用new方法,再調用init方法。單一實例通過重寫new方法,第二次執行個體化時,new返回上次的執行個體,然後該執行個體再次調用init方法。
類
類(class)是一個使用者自訂類型,開發人員可以將其執行個體化以獲得執行個體(instance),執行個體表示這種類型的對象。在Python中,類就是對象,開發人員可以像對其他對象那樣處理函數,可以在調用函數時傳遞一個類作為參數,也可以返回一個類作為函數調用的結果。任何對象,即使是一個類對象,都有一個類型。在Python中,類型和類也都是第一類對象。類對象的類型也被稱為該類的元類(metaclass)。對象的行為主要是由該類對象的類型確定的。這也適用於類:類的行為也是主要由該類的元類確定的。
class語句
class語句是建立一個類對象最常用的方法。如下:
class classname(base_classes): statement(s)
classname是一個標識符。該標識符是一個在執行完class語句之後被綁定到類對象的變數。base_classes是一個使用逗號分隔的運算式序列,這些運算式的值必須是類對象。例如:
class C(B1,B2): #B1和B2都是類 statement(s)
最後,請注意,class語句並不直接建立新類的任何一個執行個體,而是定義了在以後調用這個類建立執行個體時,所有執行個體共有的屬性集(即類對象屬性)。
類對象屬性
通常可以通過將一個值綁定到類體中的一個標識符上來指定類對象的一個屬性(即類屬性)。例如:
class C1(object): x = 23print C1.x #print:23
類對象C1包含一個名為x的屬性,該屬性被綁定為值23。我們應該知道,在執行個體被建立時,任何類屬性都由該類的所有執行個體隱式共用。
類對象會隱式設定某些類屬性。屬性__name__是類名標識符字串。屬性__bases__是類的基類的類對象的元組。例如:
print C1.__name__, C1.__bases__ #print: C1, (<type ‘object’>)
類對象還包含一個屬性__dict__,這個屬性是該類的字典對象,被用來儲存所有其他屬性。對於任何類對象C、任何對象x,以及任何標識符S(除了__name__、__bases__和__dict__),C.S等於C.__dict__[‘S’]=x。例如:
C1.y = 45C1.__dict__['z']= 67print C1.y,C1z #print: 45, 67
執行個體
類的執行個體是一個帶有任意名稱的屬性的Python對象,開發人員可以綁定和引用這些屬性。要想建立一個類的執行個體,可以調用類對象,就像該對象是一個函數一樣。每個調用都將返回一個類型為該類的新執行個體:
anInstance = C1()
開發人員可以調用內建函數isinstance(I, C),並使用一個類對象作為參數C。如果對象I是類C或類C的任何子類的一個執行個體,則instance將返回True,否則返回False。
__init__
當一個類定義或繼承了一個名為__init__的方法時,調用該類對象將對新執行個體隱式執行__int__方法以執行任何需要的與執行個體相關的初始化。該調用中傳遞的參數必須對應於__init__的參數,除了參數self。例如:
class C6(objec): def __init__(self, n); self.x = n
建立類C6的一個執行個體:
anInstance = C6(42)
__init__的主要目的就是綁定,並因此建立新建立的執行個體的屬性。__init__方法不能返回一個值,否則,Python將引發一個TypeError異常。
對於任何執行個體z,z..__class__是z所屬的類對象,而z..__dict__是z用來儲存其他屬性的字典。例如:
print anInstance.__classs__.__name__, anInstance .__dict__ #print: C6, {'x' : 42}
對於任何執行個體z,任何對象x和任何標識符S(除了__classs和__dict__),z.S = x等於z.__dict__[‘S’] = x。例如:
z.y = 45z.__dict__['z'] = 67print z.y, z.z #print: 45, 67
__new__
每個新型累都有(或者繼承了)一個名為__new__的靜態方法。當開發人員調用C(*args, **kwds)來建立類C的一個執行個體時,Python將首先調用C.__new__(C,*args, **kwds)。Python使用__new__的傳回值x作為新建立的執行個體。然後,Python將調用C.__init__(x,*args, **kwds),但是只有在x確認是C的一個執行個體,或者C的任何一個子類時才會調用該方法。例如:語句x = C(23)等同於:
x = C.__new__(C, 23)if isinstance(x, C): type(x).__init__(x, 23)
object.__new__可以建立其接受為第一個參數的類的一個新的和未初始化的執行個體。如果這個類包含一個__init__方法,則該方法將忽略其他參數,但是,如果除了第一個參數,該方法還接受了其他參數,並且第一個參數的類不包含__init__方法,則該方法將引發一個異常。下面通過實現Singleton設計模式來示範上面內容。
class Singleton(object): ## @var __Instance __Instance = None @staticmethod def GetInstance(): if Singleton.__Instance == None: Singleton.__Instance = Singleton() return Singleton.__Instance def __new__(cls, *args, **kv): print "__new__" if Singleton.__Instance == None: Singleton.__Instance = object.__new__( cls ) print "Singleton.__Instance:", Singleton.__Instance return Singleton.__Instance def __init__(self, x): print "__init__" print "self:", self self.x = x print x def PrintX(self): print self.xanInstance = Singleton(23)anotherInstance = Singleton(32)
運行結果:
分析:
從上面運行結果我們可以看出,建立一個新執行個體時,先調用new方法,再調用init方法。單一實例通過重寫new方法,第二次執行個體化時,new返回上次的執行個體,然後該執行個體再次調用init方法。