重載概念
重載是對繼承的父類方法進行重新定義。重載可以重新定義方法還可以重新定義運算符。因為通過繼承的類不一定能滿足當前類的需求。在當前類中只需要修改部分內容而達到自己的需求。
重載特點
減少代碼量和靈活指定型類
子類具有父類的方法和屬性
子類不能繼承父類的私有方法或屬性
子類可以添加新的方法
子類可以修改父類的方法
方法重載
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__之前創建對象 |
原文發布在 軟件羊皮卷 微信公眾號中,歡迎大家關注