自定義屬性訪問

2021-09-30 04:01:18 字數 3776 閱讀 2060

客戶可直接訪問屬性(使用點訪問運算子);另外,類作者也可為屬性指派特殊名稱,向客戶指明應通過方法來訪問屬性。現在要討論的是---定義特殊方法,自定義直接屬性訪問的行為。

python提供了一系列特殊方法,類可定義這些方法,以控制點訪問運算子操縱 類物件的方式。重新定義運算子行為的技術稱為「運算子過載」。對點運算子進行過載,相當於綜合了前一章所討論的兩種屬性訪問技術---客戶能直接訪問屬性 (即通過點訪問運算子),但這實際是執行訪問方法的操作。

屬性訪問自定義方法

方法 說明 

__delattr__ 

客戶刪除乙個屬性時執行(例如 del anobject.attribute) 

__getattr__ 

客戶訪問乙個屬性名,但在物件__dict__屬性中找不到這個名稱時執行(例如anobject.unfoundname) 

__setattr__ 

客戶將值指派給物件的屬性時執行(例如anobject.attribute=value) 

code1

#!

/usr/bin/env python

class time:

def__init__

(self, hour = 0, minute = 0, second = 0)

:self.hour = hour

self.minute = minute

self.second = second

def__setattr__

(self, name, value)

:if name =

="hour"

:if 0 <

= value < 24:

self.

__dict__

["_hour"

]= value

else

:raise

valueerror

,"invalid hour value: %d"

% value

elif name =

="minute"

or name =

="second"

:if 0 <

= value < 60:

self.

__dict__

["_"

+ name]

= value

else

:raise

valueerror

,"invalid % value: %d"

%(name, value)

else

:self.

__dict__

[name]

= value

def__getattr__

(self, name)

:if name =

="hour"

:return self._hour

elif name =

="minute"

:return self._minute

elif name =

="second"

:return self._second

else

:raise

attributeerror

, name

def__str__

(self)

:return

"%.2d:%.2d:%.2d"

%(self._hour, self._minute, self._second)

新的定義通過特殊方法__getattr__和__setattr__來控制客戶訪問及修改物件屬性的 方式。__init__為time類預設的建構函式。建構函式只是將引數值指派給新物件的屬性。如果類定義了特殊方法__setattr__,程式每次通 過點運算子為物件的屬性指派值時,python都會呼叫這個方法。

這裡__setattr__方法包含查錯**,用於確保物件資料處於一致性狀態。方法要接收3個引數: 物件引用(self)、要設定的屬性名以及要指派給屬性的值。首先檢測要設定的屬性是否名叫"hour",如果是,則判斷指定的值是否在正確的範圍內,如 果值在正確的範圍內,則訪問物件的__dict__屬性中恰當的鍵-值對,將值指派給屬性_hour;否則,將引發乙個異常,指出值是無效的。

非常重要的一點在於,__setattr__方法要用物件的__dict__屬性來設定物件的屬性。如果使用如下語句:

self._hour = value

那麼__setattr__方法會再次執行,並使用引數"_hour"和value,從而導致無窮遞迴。相反,通過物件的__dict__屬性來指派值,就不是呼叫__setattr__方法,而是將相應的鍵-值對插入物件的__dict__。

print1

[root@lvdbing tmp]

# python

python 2.5.2 (r252:60911, sep 20 2008, 02:27:16)

[gcc 3.4.6 20060404 (red hat 3.4.6-9)

] on linux2

type "help",,

"credits"

or"license"

for more information.

>

>

>

from timeaccess import time

>

>

> time1 = time(20, 20, 20)

>

>

>

print time1

20:20:20

>

>

>

print time1.hour, time1.minute, time1.second

20 20 20

>

>

> time1.hour = 10

>

>

>

print time1

10:20:20

>

>

> time1.minute = 61

traceback (most recent call last)

:file ""

, line 1,

infile "timeaccess.py"

, line 23,

in__setattr__

raise

valueerror

,"invalid % value: %d"

%(name, value)

valueerror

: unsupported format character 'v'

(0x76) at index 10

假如客戶程式包含以下表示式:

time1.attribute

並將其作為乙個"右值"(運算子右邊的值),python首先會在time1的__dict__屬性中查詢指定的屬性名。如果找到這個名稱,python將返回屬性的值。如果在物件的__dict__中沒有找到屬性名,python會生成以下呼叫:

time1.__getattr__(attribute)

其中的attribute是客戶試圖訪問的屬性名。方法會檢測客戶是否試圖訪問hour,minute或者second。如果是,就返回相應屬性的值。否則,方法會引用乙個異常。

自定義屬性

html view plain copy html head meta charset utf 8 title 自定義屬性 title script window.onload function script head body input type button value 按鈕 input ty...

自定義屬性

xmlns wen android orientation vertical android layout width fill parent android layout height wrap content 第二行是自定義標籤。格式如上,其中 xmlns wen 冒號後面是標籤名,在下面使用時...

自定義屬性

自定義屬性的步驟 1.首先使用在res目錄下的attr.xml檔案中,新建如下屬性集合 表示乙個屬性集合,名稱叫customprogerssbar3,這個屬性集合中包括的屬性用這種方式定義 關於format的型別有如下幾種 1.color 表示顏色,取值是乙個顏色值 屬性使用示例 2.dimensi...