Pythonのクラス例を詳しく解説

小云云
リリース: 2023-03-22 21:44:02
オリジナル
2558 人が閲覧しました

クラスは、開発者がインスタンスを作成してインスタンスを取得できるユーザー定義の型です。 Python ではクラスはオブジェクトであり、開発者は関数を他のオブジェクトと同じように扱うことができ、関数呼び出し時にクラスをパラメーターとして渡すことも、関数呼び出しの結果としてクラスを返すこともできます。クラスオブジェクトであっても、すべてのオブジェクトには型があります。 Python では、型とクラスもファーストクラスのオブジェクトです。クラス オブジェクトの型は、クラスのメタクラスとも呼ばれます。オブジェクトの動作は主に、そのクラスのオブジェクトのタイプによって決まります。これはクラスにも当てはまります。クラスの動作も主にそのメタクラスによって決まります。

classステートメント

classステートメントは、クラスオブジェクトを作成するために最も一般的に使用されるメソッドです。次のように:

class classname(base_classes):
    statement(s)
ログイン後にコピー
ログイン後にコピー

classname は識別子です。識別子は、クラス ステートメントの実行後にクラス オブジェクトにバインドされる変数です。 base_classes は、値がクラス オブジェクトである必要がある式のコンマ区切りのシーケンスです。例:

class C(B1,B2):  #B1和B2都是类
   statement(s)
ログイン後にコピー
ログイン後にコピー

最後に、class ステートメントは新しいクラスのインスタンスを直接作成するのではなく、このクラスが呼び出されて、インスタンスは後で。

クラスオブジェクトの属性

通常、クラス本体内の識別子に値をバインドすることで、クラスオブジェクトの属性(つまり、クラス属性)を指定できます。例:

class C1(object):
    x =  23print C1.x                 #print:23
ログイン後にコピー
ログイン後にコピー

クラス オブジェクト C1 には、値 23 にバインドされている x という名前のプロパティが含まれています。インスタンスの作成時に、クラス属性はそのクラスのすべてのインスタンスによって暗黙的に共有されることを知っておく必要があります。
クラスオブジェクトは特定のクラス属性を暗黙的に設定します。属性 __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
ログイン後にコピー
ログイン後にコピー

Instance

クラスのインスタンスは、開発者がバインドして参照できる任意の名前のプロパティを持つ Python オブジェクトです。クラスのインスタンスを作成するには、オブジェクトが関数であるかのように、クラス オブジェクトを呼び出します。各呼び出しは、次のタイプの新しいインスタンスを返します:

anInstance = C1()
ログイン後にコピー
ログイン後にコピー

開発者は、クラス オブジェクトをパラメータ C として組み込み関数 isinstance(I, C) を呼び出すことができます。オブジェクト I がクラス C またはクラス C のサブクラスのインスタンスである場合、instance は True を返し、それ以外の場合は False を返します。

__init__

クラスが __init__ という名前のメソッドを定義または継承する場合、クラス オブジェクトを呼び出すと、新しいインスタンスで __int__ メソッドが暗黙的に実行され、必要なインスタンス関連の初期化が実行されます。この呼び出しで渡されるパラメータは、パラメータ self を除き、__init__ のパラメータに対応する必要があります。例:

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__ メソッドが含まれていない場合、このメソッドは例外をスローします。上記の内容を、シングルトン設計パターンを実装することによって以下に示します。

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 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート