Pythonは動的言語であるため、クラスによって作成されたインスタンスは任意の属性にバインドできます。
プロパティをインスタンスにバインドする方法は、インスタンス変数または自己変数を使用します。
class Student(object):
def __init__(self, name):
self.name = name
s = Student('Bob')
s.score = 90
しかし、Studentクラス自体がプロパティをバインドする必要がある場合はどうなりますか?クラスで直接属性を定義できます。この属性はクラス属性であり、Studentクラスに属します。
class Student(object):
name = 'Student'
クラス属性を定義すると、この属性は分類されますが、クラスのすべてのインスタンスにアクセスできます。それをテストしましょう:
>>>class Student(object):
> name = 'Student'
>>>s = Student() # 创建实例s
>>>print(S.name) # 打印name属性,因为实例并没有name属性,所以会继续查找class的name属性
>Student
>>> print(Student.name) # 打印类的name属性
Student
>>> s.name = 'Michael' # 给实例绑定name属性
>>> print(s.name) # 由于实例属性优先级比类属性高,因此,它会屏蔽掉类的name属性
Michael
>>> print(Student.name) # 但是类属性并未消失,用Student.name仍然可以访问
Student
>>> del s.name # 如果删除实例的name属性
>>> print(s.name) # 再次调用s.name,由于实例的name属性没有找到,类的name属性就显示出来了
Student
上記の例からわかるように、プログラムを作成するときは、インスタンス属性とクラス属性に同じ名前を使用しないでください。同じ名前のインスタンス属性はクラス属性を保護しますが、インスタンス属性を削除するときは、use同じ名前で、アクセスはクラス属性になります。
運動
学生の数を数えるために、Studentクラスにクラス属性を追加できます。インスタンスが作成されるたびに、このクラスの属性は自動的に増加します。
最初は、カウントのすぐ下にcount + = 1と記述します。 、たとえば+1ごとに1つ生成することは可能ですか?
class Student(object):
count = 0
count += 1
def __init__(self, name):
self.name = name
if __name__ == '__main__':
print(Student.count)
bart = Student('bart')
print(Student.count)
part = Student('part')
print(Student.count)
输出结果:
1
1
1
振り返ってみると、Studentはクラス属性であり、インスタンスが作成されるたびに、クラスの__init__メソッドを呼び出す必要がありますか?正しい!__init__メソッドが呼び出されるたびに、インスタンスを作成するために呼び出されます。
class Student(object):
count = 0
def __init__(self, name):
self.name = name
Student.count += 1 # 这里要用类名
概要
- インスタンス属性は各インスタンスに固有であり、相互に干渉しません。
- クラス属性はクラスに属し、すべてのインスタンスが1つの属性を共有します。
- インスタンス属性とクラス属性に同じ名前を使用しないでください。同じ名前を使用すると、見つけにくいエラーが発生します。