過載概念
過載是對繼承的父類方法進行重新定義。過載可以重新定義方法還可以重新定義運算子。因為通過繼承的類不一定能滿足當前類的需求。在當前類中只需要修改部分內容而達到自己的需求。
過載特點
減少程式碼量和靈活指定型類
子類具有父類的方法和屬性
子類不能繼承父類的私有方法或屬性
子類可以新增新的方法
子類可以修改父類的方法
方法過載
1 # coding=utf-8 2 3 class human(object): 4 __name = '' # 定義屬性 5 __sex = 0 6 __age = 0 7 __height = 0 8 __weight = 0 9 10 def __init__(self, sex, age, height, weight): 11 self.__sex = sex 12 self.__age = age 13 self.__height = height 14 self.__weight = weight 15 16 def set_name(self,name): 17 self.__name = name 18 19 def show(self): 20 print(self.__name, self.__sex, self.__age, self.__height, self.__weight) 21 22 23 class student(human): 24 __classes = 0 25 __grade = 0 26 __num = 0 27 def __init__(self, classes,grade,num,sex,age,height,weight): # 過載 __init__ 方法 28 self.__classes = classes 29 self.__grade = grade 30 self.__num = num 31 human.__init__(self, sex, age, height, weight) 32 33 def show(self): # 過載 show 方法 34 human.show(self) 35 print(self.__classes,self.__grade,self.__num) 36 37 38 if __name__ == '__main__': 39 a = student(3,2,19910218,'男',13,'158',45) 40 a.set_name('小明') 41 a.show()
執行結果
運算子過載
運算子過載是在類方法中攔截內建的操作——當類的例項出現在內建操作中,Python自動呼叫重新定義的方法,並將重新定義方法的返回值變成了相應操作的結果
1 class List(object): 2 __list = [] 3 4 def __init__(self, *args): # 過載 __init__ 方法 5 self.__list = [] 6 for arg in args: 7 self.__list.append(arg) 8 9 def __add__(self, n): # 過載 + 運算子 10 for i in range(0,len(self.__list)): 11 self.__list[i] = self.__list[i] + n 12 13 def __sub__(self, n): # 過載 - 運算子 14 for i in range(0,len(self.__list)): 15 self.__list[i] = self.__list[i] - n 16 17 def __mul__(self, n): # 過載 * 運算子 18 for i in range(0,len(self.__list)): 19 self.__list[i] = self.__list[i] * n 20 21 def __div__(self, n): # 過載 / 運算子 22 for i in range(0,len(self.__list)): 23 self.__list[i] = self.__list[i] / n 24 25 def show(self): 26 print(self.__list) 27 28 if __name__ == '__main__': 29 myList = List(1,2,3,4,5,6,7,8,9) 30 myList.show() 31 32 myList + 3 33 myList.show() 34 35 myList - 2 36 myList.show() 37 38 myList * 2 39 myList.show()
執行結果
常見的運算子過載方法
method | overload | call |
__init__ | 建構函式 | 物件建立: X = Class(args) |
__del__ | 解構函式 | X物件收回 |
__add__ | 雲演算法+ | 如果沒有_iadd_, X+Y, X+=Y |
__or__ | 運算子| | 如果沒有_ior_,X|Y, X|=Y |
_repr__, __str__ | 列印,轉換 | print(X),repr(X),str(X) |
__call__ | 函式呼叫 | X(*args, **kwargs) |
__getattr__ | 點號運算 | X.undefined |
__setattr__ | 屬性賦值語句 | X.any=value |
__delattr__ | 屬性刪除 | del X.any |
__getattribute__ | 屬性獲取 | X.any |
__getitem__ | 索引運算 | X[key],X[i:j] |
__setitem__ | 索引賦值語句 | X[key],X[i:j]=sequence |
__delitem__ | 索引和分片刪除 | del X[key],del X[i:j] |
__len__ | 長度 | len(X),如果沒有__bool__,真值測試 |
__bool__ | 布林測試 | bool(X) |
__lt__, __gt__, __le__, __ge__, __eq__, __ne__ |
特定的比較 | X<Y,X>Y,X<=Y,X>=Y, X==Y,X!=Y 註釋:(lt: less than, gt: greater than, le: less equal, ge: greater equal, eq: equal, ne: not equal ) |
__radd__ | 右側加法 | other+X |
__iadd__ | 實地(增強的)加法 | X+=Y(or else __add__) |
__iter__, __next__ | 迭代環境 | I=iter(X), next() |
__contains__ | 成員關係測試 | item in X(任何可迭代) |
__index__ | 整數值 | hex(X), bin(X), oct(X) |
__enter__, __exit__ | 環境管理器 | with obj as var: |
__get__, __set__, __delete__ |
描述符屬性 | X.attr, X.attr=value, del X.attr |
__new__ | 建立 | 在__init__之前建立物件 |
原文釋出在 軟體羊皮卷 微信公眾號中,歡迎大家關注