Python類別的實例詳解

小云云
發布: 2023-03-22 21:44:02
原創
2547 人瀏覽過

類別(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>)</type>
登入後複製
登入後複製

類別物件也包含一個屬性__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.x
anInstance = Singleton(23)
anotherInstance = Singleton(32)
登入後複製

執行結果:

Python類別的實例詳解

#

分析:

从上面运行结果我们可以看出,创建一个新实例时,先调用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>)</type>
登入後複製
登入後複製

类对象还包含一个属性__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.x

anInstance = Singleton(23)
anotherInstance = Singleton(32)
登入後複製

运行结果:

Python類別的實例詳解

分析:

从上面运行结果我们可以看出,创建一个新实例时,先调用new方法,再调用init方法。单实例通过重写new方法,第二次实例化时,new返回上次的实例,然后该实例再次调用init方法。

以上是Python類別的實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!