本文來自於千鋒教育在阿里雲開發者社區學習中心上線課程《Python入門2020最新大課》,主講人姜偉。
對象屬性和類屬性
在⾯向對象開發中,使⽤類創建出來的實例是⼀個對象,那麼,類是否是⼀個對象呢?
實例屬性
通過類創建的對象被稱為 實例對象,對象屬性⼜稱為實例屬性,記錄對象各⾃的數據,不同對象的同名實例屬性,記錄的數據各⾃獨⽴,互不⼲擾。
class Person(object):
def __init__(self,name,age):
# 這⾥的name和age都屬於是實例屬性,每個實例在創建時,都有⾃⼰的屬性
self.name = name
self.age = age
# 每創建⼀個對象,這個對象就有⾃⼰的name和age屬性
p1 = Person('張三',18)
p2 = Person("李四",20)
類屬性
類屬性就是類對象所擁有的屬性,它被該類的所有實例對象所共有,類屬性可以通過類對象或者實例對象訪問。類屬性只能通過類對象來修改,實例對象無法修改類屬性。
class Dog:
type = "狗" # 類屬性
dog1 = Dog()
dog2 = Dog()
# 不管是dog1、dog2還是Dog類,都可以訪問到type屬性
print(Dog.type) # 結果:狗
print(dog1.type) # 結果:狗
print(dog2.type) # 結果:狗
使⽤場景:
- 類的實例記錄的某項數據始終保持⼀致時,則定義類屬性。
- 實例屬性要求每個對象為其單獨開闢⼀份內存空間來記錄數據,⽽類屬性為全類所共有 ,僅佔⽤⼀份內存,更加節省內存空間。
注意點:
1> 儘量避免類屬性和實例屬性同名。如果有同名實例屬性,實例對象會優先訪問實例屬性。
class Dog(object):
type = "狗" # 類屬性
def __init__(self):
self.type = "dog" # 對象屬性
# 創建對象
dog1 = Dog()
print(dog1.type) # 結果為 “dog” 類屬性和實例屬性同名,使⽤ 實例對象 訪問的是 實例屬性
2> 類屬性只能通過類對象修改,不能通過實例對象修改
lass Dog(object):
type = "狗" # 類屬性
# 創建對象
dog1 = Dog()
dog1.type = "dog" # 使⽤ 實例對象 創建了對象屬性type
print(dog1.type) # 結果為 “dog” 類屬性和實例屬性同名,訪問的是實例屬性
print(Dog.type) # 結果為 "狗" 訪問類屬性
# 只有使⽤類名才能修改類屬性
Dog.type = "⼟狗"
print(Dog.type) # ⼟狗
dog2 = Dog()
print(dog2.type) # ⼟狗
3> 類屬性也可以設置為私有,前邊添加兩個下劃線。 如:
class Dog(object):
count = 0 # 公有的類屬性
__type = "狗" # 私有的類屬性
print(Dog.count) # 正確
print(Dog.__type) # 錯誤,私有屬性,外部⽆法訪問。