流畅的Python 1. Python数据模型(特殊方法 __func__())
生活随笔
收集整理的這篇文章主要介紹了
流畅的Python 1. Python数据模型(特殊方法 __func__())
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1. `__getitem__()、__len__()` 方法
- 2. 特殊方法
1. __getitem__()、__len__() 方法
- 舉一個撲克牌的例子
2. 特殊方法
- python解釋器會自動調用,如 len(obj) ,解釋器 調用 obj的 __len__() 方法
- 內置的類型的 __len__() 方法,抄近路,直接讀取 ob_size 屬性
- for i in x:,是 iter(x) 調用了 x.__iter__() 方法
- 通過內置函數(如,len,iter,str等)來使用特殊方法是最好的選擇
- 不要自己隨意添加特殊方法 __func__ ,將來的 python版本 可能添加該方法
特殊方法:https://docs.python.org/3/reference/datamodel.html
from math import hypot # 返回模長 Euclidean distanceclass Vector:def __init__(self, x=0, y=0):self.x = xself.y = ydef __repr__(self): # 打印的時候輸出內容print("調用__repr__")# %r 獲取 各個屬性的標準字符串表示形式return 'Vector(%r, %r)' % (self.x, self.y)# __str__() 是在 str() 或 print() 時調用,返回的字符串更友好# 請優先使用 __repr__, 如果調用 str() 但是有沒有實現 __str__(),# 解釋器自動用 __repr__ 代替# def __str__(self):# return "print() 優先調用 __str__()"def __abs__(self):print("調用__abs__")return hypot(self.x, self.y)def __bool__(self):print("調用__bool__")# bool(x) 調用 x.__bool__(), 如果不存在,則調用 x.__len__()return bool(abs(self))# 或者# return (self.x or self.y) # 更高效def __add__(self, other):print("調用__add__")x = self.x + other.xy = self.y + other.y# 原則:不改變輸入,創建新的輸出return Vector(x, y)def __mul__(self, scalar):print("調用__mul__")# 原則:不改變輸入,創建新的輸出return Vector(self.x * scalar, self.y * scalar)def __rmul__(self, scalar): # 交換律print("調用__rmul__")# 原則:不改變輸入,創建新的輸出return Vector(self.x * scalar, self.y * scalar)v1 = Vector(2, 4) v2 = Vector(2, 1) v3 = v1 + v2 # 調用__add__ print(v3) # 調用__repr__ Vector(4, 5) print(abs(v3)) # 調用__abs__ 6.4031242374328485 print(bool(v3)) # 調用__bool__ 調用__abs__ True print(v3 * 3) # 調用__mul__ 調用__repr__ Vector(12, 15) print(3 * v3) # 調用__rmul__ 調用__repr__ Vector(12, 15) print(str(v3)) # 調用__repr__ Vector(4, 5)總結
以上是生活随笔為你收集整理的流畅的Python 1. Python数据模型(特殊方法 __func__())的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 2207. 字符串中最
- 下一篇: Java 类的封装、继承、多态