1. __init__ 添加类属性
2.__str__ 修改类的描述
3.__mro__ 只能调用 打印当前类的父结构
4.__iter__ 把类变成可迭代对象
5.__next__把类变成迭代器
6.__getitem__ 可以把类变成可以类似列表 可以从中获取指定下标的值
7.__getattr__ 如果属性或者函数不存在的情况下 不会报错 回在控制台上显示相关信息
8.__call__ 让类可以直接调用 相当于把类变成函数
9.callable 判断对象是否是可以调用的对象
class Python(object):
def __init__(self, xname):
self.name = xname
# 斐波拉且数列 前两个值是固定的
self.a, self.b = 0, 1
# 用于定制对象的描述
def __str__(self):
return 'Python object (name,%s)' % self.name
# person默认不是可迭代对象,变成一个可迭代对象,必须返回一个迭代器
def __iter__(self): # 生成一个斐波拉且数列
return self
# person变成一个迭代器
def __next__(self):
self.a, self.b = self.b, self.a + self.b
if self.a > 1000: # 如果出现一个大于1000的数字 退出循环
raise StopIteration # 主动报错 停止循环
return self.a
# preson 可以类似于list
def __getitem__(self, item): # item 可能一个下标 可能是一个切片
if isinstance(item, int): # 判断传过来是否是一个整数 下标
a, b = 1, 1
for x in range(item):
a, b = b, a+b
return a
elif isinstance(item, slice): # slice 是一个切片 判断传回来的是不是一个切片
start = item.start
stop = item.stop
if start is None: # 判断时候是一个空类型
start = 0 # start 是一个默认值
a, b = 1, 1
l = []
for x in range(stop):
if x >= start:
l.append(a)
a, b = b, a+b
return l
# 当访问 person 对象中不存在的属性和函数的时候会抛出 AttributrError 如果不想看到报错 就要重写
def __getattr__(self, item):
if item == 'age':
return 18
elif item == 'eat':
return lambda :print('eat函数执行')
def __call__(self, *args, **kwargs):
print('person可以任意调用')
if __name__ == '__main__':
p = Python('张三')
print(p)
for n in p:
print(n)
# p类似于一个list 在list还可以分片
print(p[5])
print(p[5:10])
print(p.age)
print(p.eat())
p()
print(callable(p)) # 判断p对象是否为可调用的对象