開發與維運

對象屬性和類屬性

本文來自於千鋒教育在阿里雲開發者社區學習中心上線課程《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. 類的實例記錄的某項數據始終保持⼀致時,則定義類屬性。
  2. 實例屬性要求每個對象為其單獨開闢⼀份內存空間來記錄數據,⽽類屬性為全類所共有 ,僅佔⽤⼀份內存,更加節省內存空間。

注意點:
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) # 錯誤,私有屬性,外部⽆法訪問。

配套視頻

Leave a Reply

Your email address will not be published. Required fields are marked *