程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python筆記,面向對象(11)遍歷操作與描述器

編輯:Python

遍歷操作與描述器

  • 遍歷操作
    • 怎樣讓自己創建的對象可以使用for in進行遍歷?
    • 怎樣讓自己創建的對象可以使用next函數進行訪問?
    • 迭代器的復用
  • 描述器
    • 概念
    • 定義
      • 定義方式一:property
      • 定義方式二:
    • 調用細節

遍歷操作

怎樣讓自己創建的對象可以使用for in進行遍歷?

實現_ _ 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)

怎樣讓自己創建的對象可以使用next函數進行訪問?

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]

  • 對象
  • 屬性的操作:增,改,刪,查
  • 描述

定義

定義方式一:property

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

調用細節

  • 定義一個描述器,一般通過實例來進行操縱描述器,不通過類

  • 不能順利轉化的場景:

    ​ 新式類可以,經典類不可以


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved