實現_ _ getitem _ _方法
class Person:
def __init__(self):
self.result = 1
def __getitem__(self, item):
self.result += 1
if self.result >= 6:
raise StopIteration("停止遍歷") #raise拋出異常, StopIteration停止遍歷
return self.result
pass
p = Person()
for i in p:
print(i)
2
3
4
5
實現_ _ iter _ _方法
_ _ lter _ _方法的優先級比 _ _ getitem _ _ 方法的優先級要高
class Person:
def __init__(self):
self.result = 1
def __iter__(self):
print("iter")
return iter([1,2,3,4,5,6]) #遍歷的就是方法裡面的迭代器對象
pass
p = Person()
for i in p:
print(i)
class Person:
def __init__(self):
self.result = 1
def __iter__(self):
print("iter")
return self
def __next__(self):
self.result += 1
if self.result >= 6:
raise StopIteration("停止遍歷")
return self.result
pass
p = Person()
for i in p:
print(i)
#lter()通過調用__ iter__ 返回一個迭代對象
#內部執行機制,當我們使用forin去訪問遍歷一個對象的時候,
#首先會使用iterator這個函數針對這個p對象計算出它裡面的一個迭代器,
#而這個迭代器獲取方法本質就是調用這個對象的方法來獲取,
#拿到這個迭代器之後,使用next函數來針對迭代器來獲取下一個數據,
#知道獲取完畢,拋出異常為止。
class Person:
def __init__(self):
self.age = 1
def __iter__(self): #迭代器必須實現iter和next方法
return self
def __next__(self):
self.age += 1
if self.age >= 6:
raise StopIteration("STOP")
return self.age
p = Person()
for i in p:
print(i)
import collections #判斷p是不是迭代器
print(isinstance(p, collections.Iterator))
#迭代器一定可以通過next函數進行訪問,但是能通過next函數的不一定是迭代器
可迭代對象->實現__iter__方法即可;迭代器->同時實現__iter__和__next__方法
可以描述一個屬性的對象,把多種描述的方法封裝到一個對象中,這個對象就是一個描述器,一般而言,描述器是一個包含了描述器協議中的方法的屬性值。 這些方法有 [__get__()
]get), [__set__()
]set) 和 [__delete__()
]object.delete)。 如果為某個屬性定義了這些方法中的任意一個,它就可以被稱為 [descriptor]
class Person:
def __init__(self):
self.__age = 10
@property
def age(self):
return self.__age
@age.setter
def age(self, value):
if value < 0:
value = 0
self.__age = value
@age.deleter
def age(self):
del self.__age
# age = property(age, set_age, del_age)
p = Person()
print(p.age)
class Age:
def __get__(self, instance, owner):
print("get")
def __set__(self, instance, value):
print("set")
def __delete__(self, instance):
print("del")
class Person:
age = Age()
p = Person()
p.age = 18
print(p.age)
del p.age
定義一個描述器,一般通過實例來進行操縱描述器,不通過類
不能順利轉化的場景:
新式類可以,經典類不可以