Python--クラス属性、インスタンス属性、クラスメソッド、静的メソッド

11518 ワード

クラス属性&インスタンス属性
クラス属性
クラス属性はすべてのオブジェクトに共通しています.つまり、すべてのオブジェクトが同じクラス属性を使用し、クラス属性はクラスの内部に定義されます.クラス属性はクラス名で直接呼び出すことができ、クラス属性を変更するとすべてのオブジェクトが使用されるときに変更されます.
class Student:
    name = 'chiruno'#   
    height = 1.56


obj1 = Student()#     
obj2 = Student()
print(obj1.height)#          
print(obj2.height)
Student.height = 1.60 #          
print(obj1.height)
print(obj2.height)
'''
  :
1.56
1.56
1.6
1.6
'''

インスタンスのプロパティ
インスタンス属性はオブジェクトが所有し、各オブジェクトには異なるインスタンス属性があります.インスタンス属性はインスタンスによって呼び出される必要があります.クラス内でも同じです.
class Student:
    name = 'chiruno'
    height = 1.56

    def set_grade(self):
        self.grade = 100#          ,self   java  this

obj1 = Student()
obj2 = Student()
obj1.grade = 95#       
obj2.grade = 99
print(obj1.grade)
print(obj2.grade)
'''
  :
95
99
'''

経由することもできますinit__()メソッドはすべてのオブジェクトに統一されたインスタンス属性を与え、initメソッドは構築メソッドに相当し、インスタンスの初期化時に呼び出される
class Student:
    name = 'chiruno'
    height = 1.56

    def __init__(self, grade: int):
        self.grade = grade

両者の性質
クラスプロパティは1つのメモリ領域に個別に存在し、すべてのインスタンスはそれらを参照します.
クラスのプロパティを変更するには、クラス名で変更を呼び出す必要があります.インスタンスで変更すると、インスタンスのプロパティが増加します.これは、インスタンスを使用して変更すると、インスタンス内に新しいプロパティが追加されると考えられるためです.クラス属性とインスタンス属性が同じ名前の場合、呼び出しはインスタンス属性を優先的に呼び出すという別の問題も説明されています.
class Student:
    name = 'chiruno'
    height = 1.56


obj1 = Student()
obj1.height = 111
print(Student.height)
print(obj1.height)
'''
  :
1.56
111
'''

ただし、可変タイプの場合はインスタンスで変更できますが、=を使用するとインスタンス属性の作成とみなされます.
class Student:
    name = 'chiruno'
    friends = []


obj1 = Student()
obj2 = Student()
obj1.friends.append('sakuya')

クラスメソッド
クラスメソッドを定義するには、@classmethodを追加する必要があります.その後、このメソッドはクラスメソッドとなり、クラスメソッドはクラスのメモリに存在し、すべてのインスタンスが参照を取得します.クラスメソッドを使用してクラスプロパティを変更および表示できます.
class Student:
    name = 'chiruno'
    friends = []

    @classmethod
    def set_name(cls, name):
        cls.name = name


obj1 = Student()
print(id(obj1.set_name))
print(id(Student.set_name))
'''
  :
2834049612872
2834049612872
'''

スタティツクメソッド
クラスメソッドと同様に、メソッドにアクセラレータを追加:@staticmethodその後、メソッドは静的メソッド静的メソッドに変わります.静的メソッドもクラス名でクラスプロパティを変更できます.
class Student:
    name = 'chiruno'
    friends = []

    @classmethod
    def set_name(cls, name):
        cls.name = name
        
    @staticmethod
    def add_friend(frd):
        Student.friends.append(frd)

dir関数により、ある領域内のすべての属性を簡単に調べることができます.
class Student:
    name = 'chiruno'
    friends = []

    @classmethod
    def set_name(cls, name):
        cls.name = name

    @staticmethod
    def add_friend(frd):
        Student.friends.append(frd)


print(dir(Student))