面向對象編程——實例屬性和類屬性(六)


由於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__統計減的次數。

 

小結:

實例屬性屬於各個實例所有,互不干擾;

類舒心屬於類所有,所有實例共享一個屬性;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM