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
__iter__
如果一个类想被用于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)
...
1
1
2
3
5
...
46368
75025
__getitem__
定制该方法便可使用[]访问
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:
L.append(a)
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]进行处理 所以还得继续 。。。啊