由於python是動態語言,根據類創建的實例可以任意綁定屬性。
給實例綁定屬性的方法是通過實例變量,或者通過self變量:
class Student(object): def __init__(self,name): self.name = name s = Student('Bob') #添加實例 s.score = 90 #添加屬性
但是,如果Student類本身需要綁定一個屬性呢?可以直接在class中定義屬性,這種屬性是類屬性,歸Student類所有:
>>> class Student(object): ... name = 'student' ... >>> s = Student() #創建實例 >>> print(s.name) #打印name屬性,因為實例並沒有name屬性,所以會繼續查找class的name屬性 student >>> print(Student.name) #打印類的屬性 student >>> s.name = "Michael" #給實例綁定name屬性 >>> print(s.name) #實例的屬性比類的屬性的優先級更高 Michael >>> print(Student.name) #但是類的屬性並未消失,仍然可以訪問 student >>> del s.name #刪除實例的屬性 >>> print(s.name) #再次調用實例的屬性,會從類中繼承 student
從上面的例子可以看出,在編寫程序的時候,千萬不要對實例屬性和類屬性使用相同的名字,因為相同名稱的實例屬性將屏蔽掉所有的類屬性,但是當你刪除掉實例屬性后,再使用相同的名稱,訪問到的將是類屬性。
類的屬性可以增刪(del)改(重新賦值)查(getattr、__dict__、dir()、直接打印),實例的屬性也可以增刪改查,如果實在命令行中那只是臨時的。但是不建議在外邊隨便改。
練習:
為了統計學生人數,給累增加一個屬性,每創建一個自動加一:
class Student(object): count = 0 def __init__(self,name): self.name = name Student.count +=1
測試
if Student.count != 0: print('測試失敗!') else: bart = Student('Bart') if Student.count != 1: print('測試失敗!') else: lisa = Student('Bart') if Student.count != 2: print('測試失敗!') else: print('Student:',Student.count) print('測試通過!')
結果:
Student: 2
測試通過!
還可以使用__del__統計減的次數。
小結:
實例屬性屬於各個實例所有,互不干擾;
類舒心屬於類所有,所有實例共享一個屬性;