python-過載

Tynam.Yang發表於2019-02-10

過載概念
  過載是對繼承的父類方法進行重新定義。過載可以重新定義方法還可以重新定義運算子。因為通過繼承的類不一定能滿足當前類的需求。在當前類中只需要修改部分內容而達到自己的需求。

 

過載特點
  減少程式碼量和靈活指定型類


  子類具有父類的方法和屬性
  子類不能繼承父類的私有方法或屬性


  子類可以新增新的方法


  子類可以修改父類的方法

 

方法過載

 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__之前建立物件

 

原文釋出在 軟體羊皮卷 微信公眾號中,歡迎大家關注