码迷,mamicode.com
首页 > 其他好文 > 详细

类的定制

时间:2016-07-31 17:46:13      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:

__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

类的定制

标签:

原文地址:http://www.cnblogs.com/huangxm/p/5723421.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!