#-*- coding:utf8 -*- from types import MethodType class MyClaxx(object): def __init__(self,name,age): self.name=name self.age=age def getInfo(self): return self.age,self.name def __str__(self ): return 'name:'+self.name+' age:'+str(self.age) # 如果一个类想被用于for ... in循环,类似list或tuple那样,就必须实现一个__iter__()方法, # 该方法返回一个迭代对象,然后,Python的for循环就会不断调用该迭代对象的next()方法拿到循环的下一个值, # 直到遇到StopIteration错误时退出循环。 def __iter__(self): return self def next(self): if self.age>200:#大于200时抛出StopIteration停止循环 raise StopIteration() self.age=self.age+1 return self.age # 下面的操作用于下标访问 def __getitem__(self,n): if isinstance(n, slice):#切片处理 start = n.start stop = n.stop step=n.step return start,step,stop return n #下标处理 # 当调用不存在的属性时,比如score,Python解释器会试图调用__getattr__(self, attr) # 来尝试获得属性,这样,我们就有机会返回score的值: def __getattr__(self,attr): if attr=='score': return 60 if attr=='sex': return 'M' # 建议为其他属性抛出异常 raise AttributeError('xxx') return '属性缺失' def __call__(self,*arg): return 'call '+self.name+str(self.age)+str(arg) m= MyClaxx('Tom',15) print m for ele in m: print ele # 16 # 17 # 18 # 19 # 20 # ... # 198 # 199 # 200 # 201 print m[5] # 5 print m[:100] # (None, None, 100) print m[10:20] # (10, None, 20) print m[5,10,2] # (5, 10, 2) print m.score # 60 print m.sex # M print m.weight # 属性缺失 print m()#会调用__call__方法 # call Tom201() print m(['a','b','3']) # call Tom201(['a', 'b', '3'],) # 判断一个对象是否是函数可以使用callable print callable(m) # True print callable([1,2,3]) # False