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

让实例打印出来好看
__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()函数,我们就可以判断一个对象是否是“可调用”对象。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • __str__ 我们先定义一个Student类,打印一个实例:>>> class Student(object):...
    牛崽儿酷阅读 338评论 0 0
  • __str__ 这是因为直接显示变量调用的不是__str__(),而是__repr__(),两者的区别是__str...
    木凛阅读 232评论 0 2
  • 我是一粒沙金,一粒人们肉眼无法识别的沙金,我的家在大山深处的老坪子。 我同伙伴们就藏身在老坪子的石头里。原本我以为...
    梦想2050阅读 1,260评论 1 6
  • 犯懒了三天,啥都没写!想孩子了!熊娃两天木有视频!第二天电话被告知玩累了!一切安好,勿念 这几天又开始想家了!别来...
    熊孩子妈阅读 244评论 0 0
  • , , , 。 , , , 。 ……
    Yooblue阅读 191评论 0 2