一文搞懂property函式

2021-09-25 22:06:54 字數 3519 閱讀 8307

接下來我帶大家了解乙個函式的作用以及使用技巧,希望對大家都有幫助,話不多說,接下來就開始我的表演特性

首先property有兩種用法,一種是作為函式的用法,一種是作為裝飾器的用法,接下來我們就逐一分析

property函式

看一下作為函式它包含的引數都有哪些

property(fget=none, fset=none, fdel=none, doc=none)

分析

fget獲取屬性值的方法。

fset設定屬性值的方法。

fdel刪除屬性值的方法。

doc是屬性描述資訊。如果省略,會把fget方法的docstring拿來用(如果有的話)

首先在繫結屬性時,如果我們直接把屬性暴露出去,雖然寫起來很簡單,但是,沒辦法檢查引數,導致可以把屬性隨便改,如下例子

class

student

(object):

pass

s = student

s.score =

99print

(s.score)

# 99

像上面這樣寫肯定是不行的,我們傳入的屬性值根本就無法去進行驗證,看一下不用property函式的例子

class

student

:def

__init__

(self)

: self._score =

''def

get_score

(self)

:return self._score

defset_score

(self, value):if

notisinstance

(value,

int)

:raise valueerror(

'分數必須是數字'

)if value >

100or value <0:

raise valueerror(

'分數不符實際'

) self._score = value

defdel_score

(self)

:del self._score

s = student(

)s.set_score(90)

print

(s.get_score())

s.set_score(

150)

print

(s.get_score())

# 報錯

s.del_score(

)print

(s.get_score())

# 報錯

觀察上面的例子我們是不能在外部直接訪問score屬性的,但是我們在裡面設定了幾個方法,包括獲取score,設定score,刪除score,並且在設定屬性上面我們進行了判斷,那麼這個時候我們分數就不能隨心所欲了,但是這是通過呼叫方法來達到目的

class

student

:def

__init__

(self)

: self._score =

''def

get_score

(self)

:return self._score

defset_score

(self, score)

: self._score = score

defdel_score

(self)

:del self._score

score =

property

(get_score, set_score, del_score, doc=

'學生分數'

)s = student(

)print

('檢視屬性的文件字串:'

+ student.score.__doc__)

# 檢視屬性的文件字串:學生分數

s.score =

100print

(s.score)

# 100

del s.score

print

(s.score)

# 報錯

當屬性賦值給property函式並傳入對應的方法,那麼這個屬性就能夠呼叫了,實際上,呼叫函式property時,還可不指定引數、指定乙個引數、指定三個引數或指定四個引數。如果沒有指定任何引數,建立的特性將既不可讀也不可寫。如果只指定乙個引數(獲取方法),建立的特性將是唯讀的。第三個引數是可選的,指定用於刪除屬性的方法(這個方法不接受任何引數)。第四個引數也是可選的,指定乙個文件字串。

@property裝飾器

@property提供了比property()函式更簡潔直觀的寫法。

@property裝飾的方法是獲取屬性值的方法,被裝飾方法的名字會被用做屬性名。

@屬性名.setter裝飾的方法是設定屬性值的方法。

@屬性名.deleter裝飾的方法是刪除屬性值的方法。

class

student

:def

__init__

(self)

: self._score =

'' @property

defscore

(self)

:return self._score

@score.setter

defscore

(self, value):if

notisinstance

(value,

int)

:raise valueerror(

'分數必須是數字'

)if value >

100or value <0:

raise valueerror(

'分數不符實際'

) self._score = value

@score.deleter

defscore

(self)

:del self._score

s = student(

)s.score =

100print

(s.score)

# 100

s.score =

150print

(s.score)

# 報錯

del s.score

print

(s.score)

# 報錯

總結:

一文搞懂transform skew

目錄 如何理解斜切 skew,先看乙個 demo。在下面的 demo 中,有 4 個正方形,分別是 紅色 不做 skew 變換,綠色 x 方向變換,藍色 y 方向變換,黑色 兩個方向都變換,拖動下面的滑塊可以檢視改變 skew 角度後的效果。切換 selector 可以設定 transform or...

一文搞懂記憶體屏障

gcc編譯選項中有個 o選項,表示編譯 的時候進行優化。這樣就會出現一種可能 優化後的 和優化前的 順序不一致。來看個例子 8 include9 10 int a,b 11 12 int main 13 很簡單,我們使用不加優化選項來將其編譯為組合語言 yuhao laplace workspace...

一文搞懂WordPress建站

文章首發於 日日夜夜的等待,wordpress建站教程終於來了。本篇文章適用於第一次建站的小白,幫助你從零搭建起乙個屬於自己的 既然是從零,那麼我就會帶著你從購買網域名稱等到一直搭建成功,接下來請往下看吧。建 本身是沒有什麼難度的,畢竟現在搭建乙個 的成本也很低,只是配套需要的東西有些繁瑣,我們先把...