美文网首页ITS·黑客
Python学习笔记(十八)定制类

Python学习笔记(十八)定制类

作者: 木凛 | 来源:发表于2017-05-11 15:55 被阅读2次

    __str__

    这是因为直接显示变量调用的不是__str__(),而是__repr__(),两者的区别是__str__()返回用户看到的字符串,而__repr__()返回程序开发者看到的字符串,也就是说,__repr__()是为调试服务的。

    解决办法是再定义一个__repr__()。但是通常__str__()和__repr__()代码都是一样的,所以,有个偷懒的写法

    定义后加一段

    __repr__ = __str__

    如果一个类想被用于for ... in循环,类似list或tuple那样,就必须实现一个__iter__()方法,该方法返回一个迭代对象

    class Fib(object):

        def __init__(self):

            self.a, self.b = 0, 1 # 初始化两个计数器a,b

        def __iter__(self):

            return self # 实例本身就是迭代对象,故返回自己

        def __next__(self):

            self.a, self.b = self.b, self.a + self.b # 计算下一个值

            if self.a > 100000: # 退出循环的条件

                raise StopIteration()

            return self.a # 返回下一个值

    __getitem__

    要表现得像list那样按照下标取出元素,需要实现__getitem__()方法:

    class Fib(object):

        def __getitem__(self, n):

            a, b = 1, 1

            for x in range(n):

               a, b = b, a + b

            return a

    对于Fib却报错。原因是__getitem__()传入的参数可能是一个int,也可能是一个切片对象slice,所以要做判断

    if isinstance(n, slice): # n是切片

        start = n.start

        stop = n.stop

        if start is None:

            start = 0

        a, b = 1, 1

        L = []

        for x in range(stop):

           if x >= start:

                L.append(a)

            a, b = b, a + b

        return L

    __getattr__

    写一个__getattr__()方法,动态返回一个属性

    def __getattr__(self, attr):

        if attr=='score':

            return 99

    __call__

    任何类,只需要定义一个__call__()方法,就可以直接对实例进行调用

    class Student(object):

        def __init__(self, name):

           self.name = name

        def __call__(self):

            print('My name is %s.' % self.name)

    能被调用的对象就是一个Callable对象

    >>> callable(Student())

    True

    相关文章

      网友评论

        本文标题:Python学习笔记(十八)定制类

        本文链接:https://www.haomeiwen.com/subject/aiiotxtx.html