python学习作业笔记九

#!/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


猜你喜欢

转载自blog.csdn.net/QWERTY1994/article/details/81810779