1. 程式人生 > >Python:類的附加內容

Python:類的附加內容

with語句

	語法:
    	with 表示式1[as 變數1],
        	表示式[as 變數2],....
        	語句塊
	作用:
    	使用於對資源進行訪問的場合,確保使用過程中不管是否
    		發生異常,都會執行必須的‘清理’操作,並釋放資源。
    如:
        檔案使用後自動關閉,執行緒中鎖的自動獲取和釋放等
    說明:
    	執行表示式,用as 子句中的變數繫結生成的物件
    	with語句並不改變異常的狀態 

環境管理器

	類內有__enter__和__exit__例項方法的類被稱為環境管理器
	__enter__將在進入with語句時被呼叫,並返回由as變數管理的物件
	__exit__將在離開with語句時被呼叫,且可以用引數來判斷在離開with
		語句時是否發生異常,並作出相應的處理
示例:
class a:
    def __enter__(self):
        '''此方法必須返回由as 繫結的物件'''
        print("a類已進入with語句")
    def __exit__(self,e_type,e_value,e_tb):
        '''e_type繫結異常型別,沒有異常時繫結none
        e_value繫結錯誤物件,沒有異常時繫結none
        e_tb繫結追蹤物件,沒有異常時繫結none'''
        print("a類已離開with語句")
        if e_type is None:
            print('我是沒有異常時退出with語句')
        else:
            print('有離開with語句時有異常發生')
            print(e_type)
            print(e_tb)
            print(e_value)
with a() as A:
    print('這是with語句內部的一條語句')
    int(input('輸入整數'))
print('程式正常退出')


運算子過載

什麼是運算子過載
    讓自定義的類生成的物件(例項)能夠使用運算子進行操作
作用:
    讓自定義的類的例項像內建物件一樣使用運算子
    讓程式簡潔易讀
    對自定義的物件將運算子賦值新的運算規則
算數運算子過載
方法名                運算子和表示式   說明
__add__(self, rhs)      self +  rhs  加法
__sub__(self, rhs)      self -  rhs  減法
__mul__(self, rhs)      self *  rhs  乘法
__truediv__(self, rhs)  self /  rhs  除法
__floordiv__(self, rhs) self // rhs  地板除
__mod__(self, rhs)      self %  rhs  求餘
__pow__(self, rhs)      self ** rhs  冪運算

 **rhs (right hands side)  右手邊**
	示例:
	class MyNumber:
    	def __init__(self,v):
        	self.v=v
    	def __repr__(self):
        	return 'MyNumber(%d)'%self.v
    	def __sub__(self,other):
        	v=self.v-other.v
        	return MyNumber(v)#建立一個物件並返回


	n1=MyNumber(100)
	n2=MyNumber(200)
	n3=n1.__sub__(n2)
	# n3=n1+n2   等同於n3=n1.__add__(n2)
	print(n1,'-',n2,'=',n3)
說明:
	運算子過載的方法和引數已經有固定的含義,不建議改變原來的意義
反向算數運算子的過載
	當運算子左側為內建型別,右側為自定義型別進行算數運算時,會出
	現typeerror錯誤
	因無法修改內建型別的程式碼來實現運算子過載,此時需要使用反向
	算數運算子過載來完成過載
 方法名                運算子和表示式   說明
__radd__(self, lhs)      lhs +  self  加法
__rsub__(self, lhs)      lhs -  self  減法
__rmul__(self, lhs)      lhs *  self  乘法
__rtruediv__(self, lhs)  lhs /  self  除法
__rfloordiv__(self, lhs) lhs // self  地板除
__rmod__(self, lhs)      lhs %  self  求餘
__rpow__(self, lhs)      lhs ** self  冪運算

複合賦值運算子過載

	以複合賦值算數運算子 x+=y為例,此運算子會優先呼叫 x.__ia
	dd__(y)方法		時會將複合賦值運算子拆解為x=x+y然後再呼叫
	x=x.add(y)方法,如果再不存在__add__方法則會觸發typeerror 異常
		其他複合賦值運算子也具有相同的規則
方法名                  運算子和表示式               說明
__iadd__(self,rhs)          self+=rhs                
__isub__(self,rhs)          self-=rhs
__imul__(self,rhs)          self*=rhs
__itruediv__(self,rhs)      self/=rhs
__ifloordiv__(self,rhs)     self//=rhs
__imod__(self,rhs)          self%=rhs
__ipow__(self,rhs)          self**=rhs

比較運算子的過載:

 方法名              運算子和表示式   說明
__lt__(self, rhs)    self <  rhs    小於
__le__(self, rhs)    self <= rhs    小於等於
__gt__(self, rhs)    self >  rhs    大於
__ge__(self, rhs)    self >= rhs    大於等於
__eq__(self, rhs)    self == rhs    等於
__ne__(self, rhs)    self != rhs    不等於
l. little
e. equal
g. greater
t. than

位運算子過載:

方法名              運算子和表示式   說明
__and__(self, rhs)    self &  rhs    位與
__or__(self, rhs)     self |  rhs    位或
__xor__(self, rhs)    self ^  rhs    位異或
__lshift(self, rhs)   self << rhs    左移
__rshift(self, rhs)   self >> rhs    右移

反向位運算子過載:

方法名              運算子和表示式   說明
__rand__(self, lhs)   lhs &  self     位與
__ror__(self, lhs)    lhs |  self     位或
__rxor__(self, lhs)   lhs ^  self     位異或
__rlshift(self, lhs)  lhs << self     左移
__rrshift(self, lhs)  lhs >> self     右移

複合賦值位運算子過載:

方法名              運算子和表示式   說明
__iand__(self, rhs)    self &=  rhs    位與
__ior__(self, rhs)     self |=  rhs    位或
__ixor__(self, rhs)    self ^=  rhs    位異或
__ilshift(self, rhs)   self <<= rhs    左移
__irshift(self, rhs)   self >>= rhs    右移

一元運算子的過載

方法名          運算子和表示式  說明
__neg__(self)     - self      負號
__pos__(self)     + self      正號
__insert__(self)  ~ self      取反

語法:
class 類名:
   	def __xxx__(self):
      	 ....

in / not in 運算子過載

  	 方法名             運算子和表示式
__contains__(self, e)    e in self    

索引和切片運算子的過載

L[0]
L[::2]
方法名                  運算子和表示式  說明
__getitem__(self, i)    x = self[i]  取值
__setitem__(self, i, v) self[i] = v  賦值
__delitem__(self, i)    del self[i]  刪除索引

slice 建構函式

作用:
	用於建立一個slice切片物件,此物件儲存一個切片
	的起始值,終止值和步長資訊,預設都為None
格式:
	slice(start=None, stop=None, step=None)
slice物件的屬性
	s.start 切片的起始值 預設為None
	s.stop  切片的終止值,預設為None
	s.step  切片的步長,預設為None

特性屬性 @property

實現其它語言所擁有的 getter 和 setter 功能

作用:
	用來模擬一個屬性
	通過@property裝飾器可以對模擬的屬性賦值和取值
  		加以控制
	class Student:
    	def __init__(self, score=0):
        	self.__score = score

    	def set_score(self, v):
        	'''setter'''
        	assert 0 <= v <= 100, "成績超出範圍"
        	self.__score = v

    	def get_score(self):
        	'''getter'''
        	return self.__score

	s = Student()
	print(s.get_score())
	s.set_score(99)
	# s.set_score(1000)  # 報錯
	print(s.get_score())

	# print(s.score)  # 取值
	# s.score = 99    # 正確賦值
	# s.score = 10000  # 賦值報錯
	# print(s.score)