18.Python類


Pythonはオブジェクト向け言語であり、オブジェクト向け言語にとって最も重要な概念はクラス(Class)とインスタンス(Intance)であるため、pythonはクラスまたはオブジェクトを作成する際に容易である.
クラス(Class):同じ属性とメソッドを持つオブジェクトの集合を記述します.コレクション内の各オブジェクトに共通するプロパティとメソッドを定義します.オブジェクトはクラスのインスタンスです.
class  ClassName:
    """    """
        

【クラスの内容はクラスのグローバル変数、メソッドなどを書くことができます】
例を挙げます.
class ren(object):
    '''this is a new class'''
    name = 'meinv'
    sex = 'woman'
    
a = ren()
print(type(a))
print(a.name)
print(a.sex)
a.age = 10
print(a.age)

結果:
meinv
woman
10
説明:
1.objectデフォルトはすべてのクラスの親であり、デフォルトを書かずにobjectを継承する
2.a=ren()は、クラスrenをインスタンス化することです.
3.以上の印刷aのタイプが1つのrenのクラスである
4.クラスのメソッドと変数を呼び出し、クラスの後に直接「.」を使用します.呼び出せばいいです.
5.インスタンスaに変数または値を追加したい場合は、「.」を直接使用します.変数を加えて値をつければいい
2.クラスのコンストラクタ
__init__ コンストラクション関数.オブジェクトの生成時に呼び出されます.クラスはテンプレートとして機能するため、インスタンスを作成するときにバインドする必要があると考えている属性を強制的に記入することができます.
特殊な__を定義することでinit__メソッドは、インスタンスを作成するときにname、scoreなどのプロパティをバインドします.
class Student(object):
    def __init__(self, name, score):
        self.name = name
        self.score = score

気付け_init__メソッドの最初のパラメータは常にselfであり、作成されたインスタンス自体を表すため、_init__メソッドの内部では、selfが作成したインスタンス自体を指すため、様々なプロパティをselfにバインドできます.
ありました_init__メソッドは、インスタンスを作成するときに空のパラメータを入力することはできません.init__メソッドはパラメータに一致しますが、selfは送信する必要はありません.Python解釈器はインスタンス変数を自分で送信します.
class Student(object):
    def __init__(self, name, score):
        self.name = name
        self.score = score
s = Student('ling', 89)
print(s.name)
print(s.score)

結果:
ling
89
説明:
1、パラメータを渡すときは、2つのパラメータ、nameとscoreを渡さなければなりません.そうしないと、エラーが発生します.
2,Selfのパラメータは渡さないで、pythonは自動的にStudentのインスタンス化したsを第1のパラメータ、すなわちselfに渡します
3.クラスの継承
既存のAクラスがあり、Bクラスを書く必要がありますが、BクラスはAクラスの特殊版で、私たちは継承を使用することができます.BクラスがAクラスを継承すると、Bクラスは自動的にAクラスのすべての属性と方法を得ることができます.Aクラスは親クラスと呼ばれ、Bクラスは子クラスと呼ばれ、子クラスは親クラスのすべての属性と方法を継承するほか、自分の属性と方法をカスタマイズすることができます.コードの多重化が大幅に増加しました.
継承クラスのフォーマット:
class A(  ):
	…

Pythonのクラスはマルチ継承をサポートしていますが、javaはマルチ継承をサポートしていませんが、pythonのマルチ継承をマルチインタフェースで実現できるのは簡単です.次に、マルチ継承のフォーマットを見てみましょう.
class A:        #     A
.....

class B:         #     B
.....

class C(A, B):   #     A   B
.....

マルチ継承は実は親の位置で、複数の親を直接書けばいいのですが、「,」で分かればいいのです.CクラスはAクラスとBクラスを同時に継承します.
Pythonクラスの継承に関する注意事項:
1.継承中のクラスの構造(_init()メソッド)は自動的に呼び出されず、サブクラスの構造で直接呼び出す必要があります.
2.Pythonはいつもまずサブクラスのメソッドで、サブクラスが見つからない場合は、親クラスに戻って検索します.
例1:
class parent:
    name = 'parent'
    age = 100
    def __init__(self):
        print('my name is parent')
    def get_name(self):
        return self.name
    def get_age(self):
        return self.age
class child(parent):
    def __init__(self):
        print('my name is clild')
    def hello(self):
        print('hello child')
a = child()
a.hello()
print(a.get_name())
print(a.get_age())

結果:
my name is clild
hello child
parent
100
例2:
class parent:
    name = 'parent'
    age = 100
    def __init__(self):
        print('my name is parent')
    def get_name(self):
        return self.name
    def get_age(self):
        return self.age
class child(parent):
    def hello(self):
        print('hello child')
a = child()
a.hello()
print(a.get_name())
print(a.get_age())

結果:
my name is parent
hello child
parent
100
説明:
以上の2つの例では、サブクラスが定義されていない場合_init__()メソッドでは、子クラスが初期化されると親クラスのメソッドが呼び出されますが、子クラスが__を定義するとinit__()メソッドでは、子クラスは親クラスを呼び出さない_init__()メソッド、では、子が親コンストラクタのメソッドを実装し、独自の特殊なメソッドを自分で書いている場合、どうすればいいのでしょうか.
super()
class parent(object):
    name = 'parent'
    age = 100
    def __init__(self):
        print('my name is parent')
    def get_name(self):
        return self.name
    def get_age(self):
        return self.age
class child(parent):
    def __init__(self):
        super(child, self).__init__()
        print('my name is clild')
    def hello(self):
        print('hello child')
a = child()
a.hello()
print(a.get_name())
print(a.get_age())

結果:
my name is parent
my name is clild
hello child
parent
100
説明:
子が親を呼び出す_init__()の方法
注意:
ここでclass parent(object):親クラスを定義するときは、必ず継承objectクラスを書きます.
そうでなければ、次のようなエラーメッセージが表示されます.
TypeError: super() argument 1 must be type, not classobj
parent(object)を増やせば簡単に解決できます.