#-*- 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