美文网首页ITS·黑客
【python】定制类(笔记摘录)

【python】定制类(笔记摘录)

作者: 某米狼 | 来源:发表于2017-05-14 16:31 被阅读22次

    让实例打印出来好看
    __str__
    __repr__

    class Student(object):
        def __init__(self, name):
            self.name = name
        def __str__(self):
            return 'Student object (name=%s)' % self.name
        __repr__ = __str__
    >>> print(Student('Michael'))
    Student object (name: Michael)
    
    #没有__str__就会是这样
    #>>> print(Student('Michael'))
    #<__main__.Student object at 0x109afb190>
    
    >>> s = Student('Michael')
    >>> s
    Student object (name: Michael)
    #没有__repr__就会是这样
    <__main__.Student object at 0x109afb310>
    

    __iter__
    __next__
    该方法返回一个迭代对象,然后,Python的for循环就会不断调用该迭代对象的__next__()方法拿到循环的下一个值,直到遇到StopIteration错误时退出循环。

    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 # 返回下一个值
    
    >>> for n in Fib():
    ...     print(n)
    ...
    1
    1
    2
    3
    5
    ...
    46368
    75025
    

    __getitem__
    Fib实例虽然能作用于for循环,看起来和list有点像,但是,把它当成list来使用还是不行
    实现__getitem__()方法就可以按下标访问数列的任意一项
    list有个神奇的切片方法对于Fib却报错。原因是__getitem__()传入的参数可能是一个int,也可能是一个切片对象slice,所以要做判断.
    但是没有对step参数作处理,也没有对负数作处理,所以,要正确实现一个__getitem__()还是有很多工作要做的。
    __getattr__
    __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()函数,我们就可以判断一个对象是否是“可调用”对象。

    相关文章

      网友评论

        本文标题:【python】定制类(笔记摘录)

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