Python:類的附加內容
阿新 • • 發佈:2018-11-06
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)