python中一切皆是物件,每乙個物件都能夠有多個屬性。python是怎樣管理這些屬性呢?我們來**一下。
物件的屬性包括兩部分:類屬性和
物件屬性。物件的屬性可能來自於其類的定義,叫做類屬性。類屬性可能來自於類的定義自身,也可能來自父類。乙個物件的屬性還可能是該物件例項定義的,叫做物件屬性。
物件的屬性儲存在物件的__dict__屬性中。__dict__為乙個字典,鍵為屬性名,相應的值為屬性本身。
以下是乙個樣例。
class bird(object):
feather = true
class chicken(bird):
fly = false
def __init__(self, age):
self.age = age
summer = chicken(2)
print(bird.__dict__)
print(chicken.__dict__)
print(summer.__dict__)
對於summer物件。物件的屬性包含,類屬性:feather/fly/__init__,物件屬性:age.
當我們有乙個summer物件的時候,分別查詢summer物件、chicken類、bird類以及object類的屬性,就能夠知道summer物件的全部的__dict__,就能夠找到通過物件summer能夠呼叫和改動全部的屬性了。
同乙個物件的不同屬性之間能夠存在依賴關係。
當某個屬性被改動時,我們希望依賴於該屬性的其它屬性也同一時候變化。
這時,我們不能通過__dict__的方式來靜態的儲存屬性。python提供多種即時生成屬性的方法。
當中一種稱為特性。特性是特殊的屬性。比方我們為chicken類新增乙個特性adult。當物件的age超過1時,adult為true;否則為false:
class bird(object):
feather = true
class chicken(bird):
fly = false
def __init__(self, age):
self.age = age
def getadult(self):
if self.age > 1.0: return true
else: return false
adult = property(getadult) # property is built-in
summer = chicken(2)
print(summer.adult)
summer.age = 0.5
print(summer.adult)
特性使用內建函式property()來建立。property()最多能夠載入四個引數。
前三個引數為函式。分別用於查詢特性、改動特性、刪除特性。
最後乙個引數為特性的文件,能夠為乙個字串。起說明作用。
class num(object):
def __init__(self, value):
self.value = value
def getneg(self):
return -self.value
def setneg(self, value):
self.value = -value
def delneg(self):
print("value also deleted")
del self.value
neg = property(getneg, setneg, delneg, "i'm negative")
x = num(1.1)
print(x.neg)
x.neg = -22
print(x.value)
print(num.neg.__doc__)
del x.neg
上面的num為乙個數字,而neg為乙個特性。用來表示數字的負數。當乙個數字確定時,它的負數總是確定的;而當我們改動乙個數的負數時,它本身的值也應該變化。這兩點由getneg和setneg來實現。
而delneg表示的是,假設刪除特性neg。那麼應該執行的操作是刪除屬性value。最後乙個引數為特性negative的說明文件。
我們能夠用__getattr__(self,name)來查詢即時生成的屬性。
當我們查詢乙個屬性時,假設通過__dict__方法無法找到該屬性。那麼python會呼叫物件的__getattr__方法,來即時生成該屬性。比方:
class bird(object):
feather = true
class chicken(bird):
fly = false
def __init__(self, age):
self.age = age
def __getattr__(self, name):
if name == 'adult':
if self.age > 1.0: return true
else: return false
else: raise attributeerror(name)
summer = chicken(2)
print(summer.adult)
summer.age = 0.5
print(summer.adult)
print(summer.male)
每乙個特性須要有自己的處理函式。而__getattr__能夠將全部的即時生成屬性放在同乙個函式中處理。__getattr__能夠依據函式名差別處理不同的屬性。比方上面我們查詢屬性名male的時候,raise attributeerror。
print(summer.adult) __getattr__生成adult屬性,print(summer.male)無法生成(__getattr__中沒有相應的生成項)。丟擲異常。
__setattr__(self, name, value)和__delattr__(self, name)可用於改動和刪除屬性。
它們的應用面更廣,可用於隨意屬性。
__dict__分層儲存屬性。每一層的__dict__僅僅儲存該層新增的屬性。子類不須要反覆儲存父類中的屬性。
即時生成屬性是值得了解的概念。在python開發中。你有可能使用這樣的方法來更合理的管理物件的屬性。
一入電商深似海
這幾年身邊經常有同事或朋友想做電商 有想開 小店的,有實體廠家想入駐天貓的,經常來諮詢我的意見。我對他們的回覆都是 不要輕易嘗試,這裡水很深。很多人不理解,我就說你先弄清楚三個問題 你對電商真實環境了解多少?你打算投入多少資金?你的產品有什麼優勢?備註 很多人所謂的電商就是指 所以本文也以 系來代表...
一入python深似海 淺拷貝與深拷貝
python中有乙個模組copy,deepcopy函式用於深拷貝,copy函式用於淺拷貝。要理解淺拷貝,必須先弄清楚python中的引用。python中一切都是物件,變數中存放的是物件的引用。這是乙個普遍的法則。能夠說 python 沒有賦值,僅僅有引用。如。a 1,變數a僅僅是整數物件1的引用。一...
python物件導向之資料的封裝及物件屬性的擴充套件
為了讓定義的資料型別,能使用不同的應用場景,一般情況下我們 要對當前型別的所有屬性進行封裝處理。封裝屬性之後,會提供訪問屬性資料的set get方法,書寫過程中方法中不需要新增任何限制條件,只是預留了可以新增限制條件的方法而已,後期根據專案需求進行限制和條件的完善。class goods def i...