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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python进阶-面向对象编程四:包装授权和自定制列表某些方法

發(fā)布時間:2024/4/17 python 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python进阶-面向对象编程四:包装授权和自定制列表某些方法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

包裝和授權(quán)

# 包裝和授權(quán)# 包裝的過程:一個類型通常是對已存在的類型的一些定制, # 這種做法可以新建,修改或刪除原有產(chǎn)品的功能,其它的則保持原樣。# 授權(quán)是包裝的一個特性。 # 授權(quán)的過程:所有更新的功能都是由新類的某部分來處理, # 但已存在的功能就授權(quán)給對象的默認屬性。# 授權(quán)的過程:所有更新的功能都是由新類的某部分來處理, # 但已存在的功能就授權(quán)給對象的默認屬性。 # # 應(yīng)用: 定制自己的數(shù)據(jù)類型: # 1.繼承的方式 # 2.授權(quán)的方式

?

舉個例子

# 舉個例子 import time class FileHandle:def __init__(self,filename,mode='r',encoding='utf-8'):self.file=open(filename,mode,encoding=encoding)def write(self,line):t=time.strftime('%Y-%m-%d %T')self.file.write('%s %s' %(t,line))def __getattr__(self, item):return getattr(self.file,item)f1=FileHandle('b.txt','w+') f1.write('你好啊') f1.seek(0) print(f1.read()) f1.close()

  

# 練習(xí)一:重寫自定制列表的append和insert方法

class List(list):def append(self,object:str):if not isinstance(object,int):raise TypeError("must int")super().append(object)def insert(self, index: int, object):if not isinstance(object,int):raise TypeError("must int")super().insert(index,object)l=List([1,2,3]) print(l) # [1, 2, 3] l.append(4) #會調(diào)用類本身的append方法 print(l) # [1, 2, 3, 4]# l.append("hello") 我們重寫了append方法,要求他只能接受int # raise TypeError("must int")l.insert(0,-1) #第一個0是索引,必需是int,第二個規(guī)定是int # l.insert(0,"hello") #報錯,因為我們重寫了增加和插入方法,非int類型插入報錯,必須是int類型 print(l) # [-1, 1, 2, 3, 4]

  

# 練習(xí)二:根據(jù)需求自定制列表

# 練習(xí): # 定制自己的列表類型,要求定制的自己的__init__方法, # 定制自己的append:只能向列表加入字符串類型的值 # 定制顯示列表中間那個值的屬性(提示:property) # 其余方法都使用list默認的,比如insert()可以插入數(shù)字(提示:__getattr__加反射)# 練習(xí)二 class List:def __init__(self, seq):self.seq = seqdef append(self, p_object):' 派生自己的append加上類型檢查,覆蓋原有的append'if not isinstance(p_object, str):raise TypeError('must be str')else:self.seq.append(p_object)@propertydef mid(self):'新增自己的方法'index = len(self.seq) // 2return self.seq[index]# 沒有該屬性時候的處理方式,自動調(diào)用__getattr__,自動調(diào)用原列表insert方法# 注意此處,因為是對象的屬性是self,但是getattr里面的是自己定制的init,self.seq,否則造成遞歸def __getattr__(self, item):print("傳入__getattr__:",self.seq,item)return getattr(self.seq, item)# 造成遞歸# def __getattr__(self, item):# return getattr(self,item)def __str__(self):return str(self.seq)x = ['h', 'e', 'l', 'l'] l = List(x) print(l) # ['h', 'e', 'l', 'l']# 實現(xiàn)取特定數(shù)據(jù)類型的添加 l.append('o') print(l) # ['h', 'e', 'l', 'l', 'o']# 實現(xiàn)取中間值方法 print(l.mid) # l# 其余方法用默認的,比如insert l.insert(0, -123) print(l) # 傳入__getattr__: ['h', 'e', 'l', 'l', 'o'] insert 列表序列和方法 # [-123, 'h', 'e', 'l', 'l', 'o']

  

練習(xí)三:權(quán)限與列表

# 練習(xí)三 class List:def __init__(self, seq, permission=False):self.seq = seqself.permission = permissiondef clear(self):if not self.permission:raise PermissionError('not allow the operation')self.seq.clear()def __setattr__(self, key, value):if not self.permission:raise PermissionError('not allow the operation')else:self.__dict__[key] = valuedef __setattr__(self, key, value):if not isinstance(value, str):raise TypeError("must be str")self.__dict__[key] = valuedef __delattr__(self, item):self.__dict__.pop()def __str__(self):return str(self.seq)l = List([1, 2, 3]) # l.clear() #此時沒有權(quán)限,拋出異常l.permission = True print(l) l.clear() print(l)# 基于授權(quán),獲得insert方法 l.insert(0, -123) print(l)

  

?

轉(zhuǎn)載于:https://www.cnblogs.com/adamans/articles/7517442.html

總結(jié)

以上是生活随笔為你收集整理的python进阶-面向对象编程四:包装授权和自定制列表某些方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。