在自訂類別內加入對應的方法,讓自訂類別建立的實例能像內建物件一樣進行內建函數操作,這就是函數重寫。
物件轉字串函數:repr(obj) ,傳回一個能代表此物件的表達式字串,通常eval(repr(obj)) == obj (這個字串通常是給python解釋執行器運作用的),str(obj) 透過給定的物件傳回一個字串(這個字串通常是給人閱讀的)。
物件轉字串函數的重寫方法:
#repr(obj) 函數的重寫方法:
def __repr__(self):
str(obj) 函數的重寫方法:
def __str__(self):
說明:
1. str(obj) 函數先找出, obj. __str__()方法,呼叫此方法並傳回結果
2. 如果沒有obj.__str__()方法時,則傳回obj.__repr__()方法的結果並傳回
#3. 如果obj.__repr__方法不存在,則呼叫object類別的__repr__實例方法顯示<__main__.XXXX object at 0xAABBCCDD>格式的字串
#範例:
# 此示例示意通过重写 repr 和 str方法改变转为字符串的规则 class MyNumber: def __init__(self, value): '构造函数,初始化MyNumber对象' self.data = value def __str__(self): '''转换为普通人识别的字符串''' # print("__str__方法被调用!") return "自定义数字类型对象: %d" % self.data def __repr__(self): '''转换为eval能够识别的字符串''' return 'MyNumber(%d)' % self.data n1 = MyNumber(100) n2 = MyNumber(200) print('repr(n1) ====>', repr(n1)) print('str(n2) ====>', str(n2))
相關建議:《Python視訊教學》
其它內建函數的重寫方法:
__abs__ abs(obj) 函數
__len__ len(obj) 函數(必須回傳整數)
__reversed__ reversed(obj) 函數(必須傳回可迭代物件
o__o#cfound 範例:# 此示例示意abs 函数的重写
class MyInteger:
def __init__(self, v):
self.data = v
def __repr__(self):
return 'MyInteger(%d)' % self.data
def __abs__(self):
v = abs(self.data)
return MyInteger(v) # 用v创建另一个MyInteger对象
def __len__(self):
return 10000
I1 = MyInteger(-10)
print('I1 =', I1)
I2 = abs(I1)
print("I2 =", I2)
print('len(I2)=', len(I2)) # 10000
__complex__ complex(obj) 函數
__int__ int(obj) 函數
__float__ float(obj) 函數
__bool__ bool(obj) 函數 # (請參閱下方布林測試函數重載)
### 此示例示意数据转换构造函数的重写方法 class MyNumber: def __init__(self, value): self.data = value def __repr__(self): return 'MyNumber(%d)' % self.data def __int__(self): 'int函数的重载' return self.data n1 = MyNumber(100) x = int(n1) print(n1) print(bool(n1)) # True n2 = MyNumber(0) print(bool(n2)) # True
#格式:
__bool__
#作用:
用於bool(obj) 函數取值
用於if語句的真值運算式中 用於while 語句的真值表達式中
說明:1. 當自訂的類別內有__bool__(self) 方法時,以此方法的回傳值作為bool(obj ) 的回傳值
2. 當不存在__bool__(self) 方法時,bool(x) 傳回__len__(self) 方法的傳回值是否為零來測試布林值# 3. 當不存在__len__(self) 方法時,則直接傳回True
#範例:# 此示例示意bool(x) 函数的重写 class MyList: '自定义类型的列表,用来保存数据,内部用一个列表来存储数据' def __init__(self, iterable=()): self.data = [x for x in iterable] def __repr__(self): return 'MyList(%s)' % self.data def __len__(self): '''返回长度''' print("__len__方法被调用") return len(self.data) def __bool__(self): print("__bool__方法调用") for x in self.data: if not x: return False return True # return False # <<=== 所有对象都为False myl = MyList([0, -1, 2, -3]) # myl = MyList() print(myl) print(bool(myl)) if myl: print("myl为真值") else: print('myl为假值')
以上是python函數重寫怎麼理解的詳細內容。更多資訊請關注PHP中文網其他相關文章!