一入python深似海 物件的屬性

2021-09-07 12:17:18 字數 3256 閱讀 7807

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...