类的定制

__str__

首先看个例子:

>>> class Student(object):
...     def __init__(self, name):
...         self.name = name
...
>>> print(Student('Michael'))
<__main__.Student object at 0x109afb190>

这样打印出的不好看, 给它定制一下:

>>> class Student(object):
...     def __init__(self, name):
...         self.name = name
...     def __str__(self):
...         return 'Student object (name: %s)' % self.name
...
>>> print(Student('Michael'))
Student object (name: Michael)

如果不用print()打印,显示的还是不好看:

>>> s = Student('Michael')
>>> s
<__main__.Student object at 0x109afb310>

这是因为直接显示调用 的不是__str__,而是__repr__(), 再定义一个__repr__()就行了,写法跟__str__完全一样。还有个简单的写法:

class Student(object):
    def __init__(self, name):
        self.name = name
    def __str__(self):
        return 'Student object (name=%s)' % self.name
    __repr__ = __str__

__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 # 返回下一个值

 

__getattr__

如果调用一个不存在的属性或方法,就会报错; 想要实现当调用 一个不存在的方法或属性时,给它返回自定义的内容。那就是再写一个__getattr__()方法:

class Student(object):

    def __init__(self):
        self.name = 'Michael'

    def __getattr__(self, attr):
        if attr=='score':
            return 99

>>> s = Student()
>>> s.name
'Michael'
>>> s.score
99

如果我们调用其它的不存在的属性时,则会返回None,因为我们定义的__getattr__() 返回的就是None, 所以我们可以让__getattr__()响应特定属性的请求,其它的抛出AttributeError错误

class Student(object):

    def __getattr__(self, attr):
        if attr=='age':
            return lambda: 25
        raise AttributeError('\'Student\' object has no attribute \'%s\'' % attr)

 

__call()__

当我们执行一个实例时,自动调用的方法:

class Student(object):
    def __init__(self, name):
        self.name = name

    def __call__(self):
        print('My name is %s.' % self.name)

>>> s = Student('Michael')
>>> s() # self参数不要传入
My name is Michael.

这样的调用方式和函数是一样的,那我们要怎么区分一个变量是函数还是实例呢?

>>> callable(Student())
True
>>> callable(max)
True
>>> callable([1, 2, 3])
False
>>> callable(None)
False
>>> callable('str')
False
posted @ 2016-07-31 17:07  黄小墨  阅读(203)  评论(0编辑  收藏  举报