一、常見的特殊方法
# 重寫__repr__方法(相當於java中的toString方法)
class Dog:
name = ''
age = 0
def __repr__(self) -> str:
return "name:" + self.name + ",age:" + str(self.age)
d = Dog()
d.name = '小狗'
d.age = 20
print(d)
class Apple:
def __init__(self, color, weight):
self.color = color
self.weight = weight
def __repr__(self):
return "Apple[]"
a = Apple('紅色', 5.68)
print(a)
需要說明的是,不要以爲對一個變量執行del操作,該變量所引用的對象就會被回收 -- 只有當對象的引用計數變成0時,該對象纔會被回收,因此,如一個對象有多個變量引用它 ,那麼del其中一個變量是不會回收該對象的。
二、與反射相關的屬性和方法
#與反射相關的屬性和方法
"""
hasattr(obj,name) 檢查對象是否包含name的屬性或者防範
getattr(obj,name[,default]) 獲取對象中名字爲name的屬性的屬性值
setattr(obj,name,value,/) 將obj對象的name屬性設爲value
"""
三、與序列相關的特殊方法
四、生成器
# 實現迭代器
class Fibs:
def __init__(self, len):
self.first = 0
self.sec = 1
self.__len = len
def __next__(self):
if self.__len == 0:
raise StopIteration
# 完成數列計算
self.first, self.sec = self.sec, self.first + self.sec
self.__len -= 1
return self.first
def __iter__(self):
return self
fibs = Fibs(10)
print(next(fibs))
for el in fibs:
print(el, end=' ')
# 創建生成器
"""
1.定義一個包含yield語句的函數
2.調用第一步創建的函數得到生成器
"""
def test(val, step):
print("函數開始執行~~~~~~~~~~~~")
cur = 0
# 遍歷0~val
for i in range(val):
cur += i * step
yield cur
"""yield cur語句的作用
每次返回一個值,有點類似於return
凍結執行,程序每次執行yield語句時就會被暫停。
在程序被yield語句凍結之後,當程序再次調用next()函數獲取生成器的下一個值時,
程序纔會繼續向下執行
需要指出的是,調用包含yield語句的函數並不會立即執行,它只會返回一個生成器。
只有當程序通過next()函數調用生成器或者遍歷生成器時,函數纔會真正執行
"""
t = test(10, 2)
# 獲取下一個值
print(next(t))
print(next(t))
# 將生成器轉換成列表
l = list(t)
t = tuple(t)
#close() 該方法用於停止生成器,關閉生成器之後,無法再獲取下一個值,否則就會報錯
#throw() 該方法用於在生成器內部(yield語句內)引發一個異常
五、運算符重載的特殊方法