python_analytics

主にpythonやライブラリーを使ったデータ解析、機械学習、統計学などについて書いていきます

python クラスとインスタンスについて

クラスとインスタンス

クラスから作られたオブジェクトのことを、インスタンスという。

■クラス変数について
クラス変数とは、クラス自体が保持する変数を指す。 クラス名の下に宣言された変数はクラス変数とみなす。

クラス変数が定義されていると、インスタンス作成時に、インスタンスにも同じ変数名が設定されます。 つまり、(同名のインスタンス変数がなければ)selfを通してクラス変数を利用できます。 これは、クラス変数をインスタンス変数のデフォルト値にするための機能ですが、紛らわしいです。 クラス自体が保持する変数は、self.変数名としないでクラス名.変数名の形式で利用するようにしましょう。 特別な理由がない限り、self.変数名で利用したい場合は、クラス変数は定義せずにinitメソッド内で定義する。

■クラスのイメージ
pyq

ソフトウェアの設計において最も重要なのは、抽象化する力です。複数の物事の共通点を見つけて、それらをひとつの概念として抽出する(=これがクラスになる)ことが必要。共通点を見つけて同じ性質を与えることで(個人という概念を抽出して属性を付与する)、ボリュームが増えたり減ったりしてもモノとして機能するようになります。なので、自分が作っているシステムの動作イメージから、動作の過程で必要な情報は一体何なのかを考えてカテゴリー分けを行い、ひとつのコンセプトや概念として抽出することが重要です。

■クラスのイメージ

「ヒト」・・・そのシステムやアプリケーションにおける登場人物
「モノ」・・・そのシステムやアプリケーションで扱うサービス

class sample1:
    name = "name"

print(sample1.name)
sample1.name="changed_name"
print(sample1.name)
print()

class sample2:
    def __init__(self,value):
        self.value =value
s1=sample2("AAA")
s2=sample2("BBB")
print(s1.value)
print(s2.value)
s1.value="CCC"
print(s1.value)
print(s2.value)

■メソッド
クラスが内包する関数をメソッドと呼びます。メソッドはクラスに関連する処理を記述。 クラスが内包するデータを属性と呼びます。属性はクラスのインスタンスごとのデータを保持。

__init__

クラスからインスタンスが生成された直後に実行される、特殊なメソッド

class User(object):

    def __init__(self, aa, bb):
        self.aa = namae
        self.bb = tosi

    def info(self):
        return self.namae + ':' + str(self.tosi)

■他のクラスがアクセスできるかどうかを制限について

(アンダースコア×2)で始まるクラス変数やインスタンス変数については、クラス名やオブジェクト名を経由して参照できなくなります。データに対してアクセス制限をつけることができます。
num2や__num3にアクセスするには、このように関数の内部からアクセスする。

class sample:
    num1 =100
    __num2 =200
    
    def __init__(self):
        self.__num3 =300
        
    def show_num(self):
        print(sample.__num2)
        print(self.__num3)

print(sample.num1)
s = sample()
s.show_num()

100
200
300

name変数は、実行されている状況により値が変わります。 python xxx.pyと実行した場合:xxx.pyの中では、nameの値は'main'という固有の文字列になる。

■クラスの継承


クラスには親子関係を定義できます。あるクラスの情報(変数や関数)を引き継いで、新しいクラスを作成できます。

class A:
    def __init__(self):
        self.name = 'Class A'
class B(A):
    pass
b = B()
print(b.name)  # Class A

■オーバーライド
継承では同じメソッドがあると、内容を上書きして差し替えることが可能です。

親クラスのメソッドに、子クラスからアクセスする時に使うのが、super関数です。
super().親クラスのメソッド(引数)のように記述します。

class A:
    def hello(self):
        print("Class A says Hello")

class B(A):
    def hello(self):
        super().hello()
        print("Class B says Hello")
b =B()
b.hello()

Class A says Hello
Class B says Hello

■クラス作成

class Menu:
    def __init__(self,name,price):
        self.name=name
        self.price=price
    def discount20(self):
        return int(self.price*0.8)

        

def main():
    """メインの処理"""
    menu_1 = Menu('のり弁', 350)
    menu_2 = Menu('シャケ弁', 400)

    print(menu_1.name + 'は' + str(menu_1.discount20())
          + '円(通常:' + str(menu_1.price) + '円)')
    print(menu_2.name + 'は' + str(menu_2.discount20())
          + '円(通常:' + str(menu_2.price) + '円)')


if __name__ == '__main__':
    main()
>>
のり弁は280円(通常:350円)
シャケ弁は320円(通常:400円)