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

__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学习笔记(十八)定制类)