日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python都有哪些包装_Python基础:21包装

發布時間:2025/3/11 python 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python都有哪些包装_Python基础:21包装 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

“包裝”在Python 編程中經常會被提到的一個術語。意思是對一個已存在的對象進行包裝,可以是對一個已存在的對象,增加,刪除,或者修改功能。

可以包裝任何類型(type)作為一個類(class)的核心成員,以使新對象的行為模仿你想要的數據類型中已存在的行為,并且去掉你不希望存在的行為。

授權是包裝的一個特性,實現授權的關鍵點就是覆蓋__getattr__()方法,在其中包含一個對getattr()內建函數的調用。

特殊方法__getattr__()的工作方式是,當搜索一個屬性時,任何局部對象首先被找到(定制的對象)。如果搜索失敗了,則__getattr__()會被調用。

換言之,當引用一個屬性時,Python 解釋器將試著在局部名稱空間中查找那個名字,如果沒有在局部字典中找到,則搜索類名稱空間,最后,如果兩類搜索都失敗了,搜索則對原對象開始授權請求,此時,__getattr__()會被調用。

包裝的一個簡單例子:

classWrapMe(object):def __init__(self, obj):

self.__data =objdefget(self):return self.__data

def __repr__(self):return ‘self.__data‘def __str__(self):return str(self.__data)def __getattr__(self, attr):return getattr(self.__data, attr)

這里將用到復數,因為所有Python數值類型,只有復數擁有屬性:

>>> wrapcomplex =WrapMe(3.5+4.2j)>>>wrapcomplex

(3.5+4.2j)>>>wrapcomplex.real3.5

>>>wrapcomplex.imag4.2

>>>wrapcomplex.conjugate()

(3.5-4.2j)>>>wrapcomplex.get()

(3.5+4.2j)

訪問復數的三種屬性,我們的自定義類中一種都沒有定義,對這些屬性的訪問,是通過getattr()方法,授權給對象。調用get()方法沒有授權,因為它是為我們的對象定義的。

下一個使用包裝類的例子用到一個列表。我們將會創建對象,然后執行多種操作,每次授權給列表方法。

>>> wraplist =WrapMe([123, 'foo', 45.67])>>>wraplist.append('bar')>>>wraplist.append(123)>>>wraplist

[123, 'foo', 45.67, 'bar',123]>>>wraplist.index(45.67)2

>>>wraplist.count(123)2

>>>wraplist.pop()123

>>>wraplist

[123, 'foo', 45.67, 'bar']

注意,只有已存在的屬性是在此代碼中授權的。特殊行為沒有在類型的方法列表中,不能被訪問,因為它們不是屬性。一個例子是,對列表的切片操作,它是內建于類型中的,而不是像append()方法那樣作為屬性存在的。也就是說,切片操作符是序列類型的一部分,并不是通過__getitem__()特殊方法來實現的。

>>> wraplist[2]

Traceback (most recent calllast):

File"", line 1, inTypeError:'WrapMe' objectdoes not support indexing

然而,還有一種"作弊"的方法,訪問實際對象[通過get()方法]和它的切片能力.

>>> reallist =wraplist.get()>>> reallist[3]'bar'

這就是為什么需要實現get()方法了----僅僅是為了我們需要取得對原對象進行訪問這種情況。

另外一個例子,描述了一個包裝文件對象的類。我們的類與一般的文件對象行為完全一樣, 除了在寫模式中,字符串只有全部為大寫時,才寫入文件。下面提供一個文件類對象,定制write()方法,同時,給文件對象授權其它的功能:

classCapOpen(object):def __init__(self, fn,mode='r', buf=-1):

self.file=open(fn, mode, buf)def __str__(self):returnstr(self.file)def __repr__(self):return`self.file`defwrite(self, line):

self.file.write(line.upper())def __getattr__(self, attr):returngetattr(self.file, attr)>>> f = CapOpen('/tmp/xxx','w')>>>f.write('delegation example\n')>>>f.write('faye is good\n')>>>f.write('at delegating\n')>>>f.close()>>>f

可以看到,唯一不同的是第一次對CapOpen()的調用,而不是open()。除了write(),所有屬性都已授權給文件對象:

>>> f =CapOpen('/tmp/xxx', 'r')>>> for eachLine inf:

...printeachLine,

...

DELEGATION EXAMPLE

FAYE IS GOOD

AT DELEGATING

總結

以上是生活随笔為你收集整理的python都有哪些包装_Python基础:21包装的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。