#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2018/8/17 14:34
# @Author :
# 多重继承
# 定制类
# 1.__clots__限定类的属性
# 2.__len__()作用于len()函数
# 3.__str__() 调用print()输出对象的时候回调用这个函数
# 4.__repr__() 在控制台直接输出对象的时候 调用的就是这个函数
# __str__和__repr__的区别 前者是返回用户看到的字符串 后者是返回程序开发者看到的字符串 ,是为调试服务的
# 4.__iter__() 用于对象for...in...循环,类似list或突破那样 ,就必须实现一个__iter__()方法 该方法返回一个迭代对象
# 然后调用__next__() 方法拿到循环的下一个值 ,直到遇到StopIteration
# 根据这个我们可以写一个斐波那契类
class Fib(object):
def __init__(self, max):
# 初始化两个计算数
self.a, self.b = 0, 1
self.max = max
def __iter__(self):
return self
def __next__(self):
self.a, self.b = self.b, self.a + self.b
if self.a > self.max:
raise StopIteration()
return self.a
for n in Fib(1000):
print(n)
# 5.__getitem__ 上面实例看起来和list有点像 但是他不能类似list[5] 取5位置数据 这个就是为了实现list的功能做的
print("----------------Fib2---------------")
class Fib2(object):
def __init__(self, max):
self.a, self.b = 0, 1
self.max = max
def __iter__(self):
return self
def __next__(self):
self.a, self.b = self.b, self.a + self.b
if self.a > max:
raise StopIteration()
return self.a
def __getitem__(self, item):
a, b = 0, 1
for n in range(item):
a, b = b, a + b
return a
b2 = Fib2(200)
print(b2[4])
# list的切片怎么实现呢?
print("----------------Fib3---------------")
class Fib3(object):
def __init__(self, max):
self.a, self.b = 0, 1
self.max = max
def __iter__(self):
return self;
def __next__(self):
self.a, self.b = self.b, self.a + self.b
if self.a > self.max:
raise StopIteration()
return self.a
'''没有对负数支持'''
def __getitem__(self, item):
if isinstance(item, int):
a, b = 0, 1
for i in range(item):
a, b = b, a + b
return a
if isinstance(item, slice):
start = item.start
stop = item.stop
step = item.step
if start is None:
start = 0
if stop is None:
stop = self.max
if step is None:
step = 1
a, b = 0, 1
L = []
nStep = start
for x in range(stop):
a, b = b, a + b
if x >= start and x < stop:
if nStep == x or (x - step) == nStep:
L.append(a)
nStep = x
return L
if isinstance(item, str):
pass
b3 = Fib3(10000)
print(b3[10])
print(b3[3:9])
print(b3[3:9:2])
# __call__() 可以认为是对象的默认方法
class Student(object):
def __call__(self, *args, **kwargs):
print(args, kwargs)
s = Student()
s("症患者", name='小明')
class Student2(object):
pass
# 可以用callable()函数判断一个对象是否可以直接调用
print(callable(s)) # ---> True
print(callable(Student2())) # ---->False