1 通過屬性私有化+只讀屬性實(shí)例方法
- 基本操作
class Person:
def __init__(self):
self.__age = 18
def getAge(self):
return self.__age
p1 = Person()
# print(p1.__age) # error
# 通過實(shí)例方法讀取
print(p1.getAge())
- 優(yōu)化(通過@property 裝飾器)
讓實(shí)例可以通過p1.age
方式讀取屬性包蓝,而不是通過實(shí)例方法始苇,同時(shí)p1.age = 1
操作是要報(bào)錯(cuò)搁拙,而不是給實(shí)例添加 age 屬性
# 1云挟、讓類繼承object
class Person(object):
def __init__(self):
self.__age = 18
#2矫限、通過@property 讓實(shí)例對(duì)象以".age"的方式, 來使用這個(gè)方法
@property
def age(self): #3哺哼、方法名直接使用屬性名
return self.__age
p1 = Person()
print(p1.age)
# p1.age = 10 # error
2 property
2.1 property
作用:將一些“屬性的操作方法”關(guān)聯(lián)到某一個(gè)屬性中。作用:將一些“屬性的操作方法”關(guān)聯(lián)到某一個(gè)屬性中叼风。
2.2 類區(qū)分
經(jīng)典類
:沒有繼承(object)
新式類
:有繼承(object)
python2.x 定義類時(shí)取董,默認(rèn)不繼承 object
python3.x 定義類時(shí),默認(rèn)繼承 object
可通過類.__base__
打印查看新定義類基類
- 注意:建議使用新式類无宿,且一般讓類顯式繼承 object甲葬,這樣 python2.x 或3都能夠使用新式類
2.3 屬性的讀寫 - property 在新式類和經(jīng)典類中的使用方式
2.3.1 新式類
- 使用方式一,property 類的使用
class Person(object):
def __init__(self):
self.__age = 18
def get_age(self):
return self.__age
def set_age(self, value):
self.__age = value
age = property(get_age, set_age)
p = Person()
print(p.age)
p.age = 22
print(p.age)
print(p.__dict__) # 確定賦值時(shí)候并不是給實(shí)例添加 age 屬性
>>>> 打印結(jié)果
18
22
{'_Person__age': 22}
- 使用方式二懈贺,參考上圖 property 的介紹時(shí)給出的內(nèi)部實(shí)現(xiàn)例子经窖,使用其中的拆分寫法
class Person(object):
def __init__(self):
self.__age = 18
@property
def age(self):
return self.__age
@age.setter # 因?yàn)槭菍?duì) age 進(jìn)行裝飾器,所以 get 方法需要先寫上
def age(self, value):
self.__age = value
p = Person()
print(p.age)
p.age = 22
print(p.age)
print(p.__dict__)
>>>> 打印結(jié)果
18
22
{'_Person__age': 22}
問題:@property 與 @property.setter 的關(guān)系
2.3.2 經(jīng)典類
結(jié)果:不管是方式一(使用 property 類方式)梭灿,還是方式二(參考property 類的內(nèi)部實(shí)現(xiàn)方式)画侣,都是只能管理 get 方式,其他方法不能被管理到堡妒,即使是把其他方法寫上(如:set 方法)配乱,進(jìn)行賦值時(shí)候也就是給實(shí)例對(duì)象添加新的屬性而已
以下代碼環(huán)境在 python2.x
- 使用方式一,property 類的使用
# _*_ encoding:utf-8 _*_
class Person:
def __init__(self):
self.__age = 18
def get_age(self):
return self.__age
def set_age(self, value):
self.__age = value
age = property(get_age, set_age)
p = Person()
print(p.age)
p.age = 22
print(p.age)
print(p.__dict__) # 確定賦值時(shí)候并不是給實(shí)例添加 age 屬性
>>>> 打印結(jié)果
18
22
{'age':22, '_Person__age': 18}
- 使用方式二皮迟,參考上圖 property 的介紹時(shí)給出的內(nèi)部實(shí)現(xiàn)例子搬泥,使用其中的拆分寫法
# _*_ encoding:utf-8 _*_
class Person:
def __init__(self):
self.__age = 18
@property
def age(self):
return self.__age
@age.setter
def age(self, value):
self.__age = value
p = Person()
print(p.age)
p.age = 22
print(p.age)
print(p.__dict__)
>>>> 打印結(jié)果
18
22
{'age':22, '_Person__age': 18}
- 所以建議使用新式類,這樣以后使用屬性更加方便