class chain(object): def __init__(self,path=''): self._path = path def __getattr__(self,path): return chain('%s/%s' % (self._path, path)) def __call__(self,path): return chain('%s/%s' % (self._path, path)) def __str__(self): return self._path __repr__ = __str__ print(chain().status.user.timeline.list)print(chain().status.user('kopite').timeline.list)
__getattr__ 找不到相對於的屬性時呼叫
如:
s = chain()
print(s.name)
輸出--->/name
__call__ 本身也可以作為函式
如:
s = chinai()
print(s.uers('kopite'))
-->/users/kopite
__str__ print中直接列印
__repr__ 直接列印
chain().user.bin
-->/user/bin
如果乙個類想被用於for ... in
迴圈,類似list或tuple那樣,就必須實現乙個__iter__()
方法,該方法返回乙個迭代物件,然後,python的for迴圈就會不斷呼叫該迭代物件的__next__()
方法拿到迴圈的下乙個值,直到遇到stopiteration
錯誤時退出迴圈。
class fib(object):
def __init__(self):
self.a, self.b = 0, 1 # 初始化兩個計數器a,b
def __iter__(self):
return self # 例項本身就是迭代物件,故返回自己
def __next__(self):
self.a, self.b = self.b, self.a + self.b # 計算下乙個值
if self.a > 100000: # 退出迴圈的條件
raise stopiteration();
return self.a # 返回下乙個值
>>> for n in fib():
... print(n)
...112
35...46368
75025
定製該方法便可使用訪問
class fib(object):
def __getitem__(self, n):
if isinstance(n, int): # n是索引
a, b = 1, 1
for x in range(n):
a, b = b, a + b
return a
if isinstance(n, slice): # n是切片
start = n.start
stop = n.stop
if start is none:
start = 0
a, b = 1, 1
l =
for x in range(stop):
if x >= start:
a, b = b, a + b
return l
>>> f = fib()
>>> f[0]
1>>> f[1]
1
>>> f[0:5]
[1, 1, 2, 3, 5]
可實現訪問 切片也可以
但沒有對f[::2]進行處理 所以還得繼續 。。。啊
Python學習 定製序列
要想成功實現容器的定製,需要先明白協議。協議類似其他程式語言中的介面,規定了哪些方法必須要定義。關於定製容器的一些協議 像序列型別 如列表 元組 字串 或者對映型別 字典 都是屬於容器型別 如果希望定製的容器是不可變的話,只需要定義 len 和 getitem 方法 如果希望定製的容器是可變的話,除...
python定製 python中定製類
1 python中 str 和repr 如果要把乙個類的例項變成 str,就需要實現特殊方法 str classperson object def init self,name,gender self.name name self.gender genderdef str self return p...
整理Python(定製類 特殊方法)
1.str 和 repr 如果把乙個類的例項變成str,就需要實現特殊方法 str class person object def init self,name,gender self.name name self.gender gender def str self return person s...