python:定制类

1、str

如果我们定义一个类,打印出来实例如下:

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

打印出<main.Student object at 0x0000000001E827B8>这一串并不好看,我们想返回一个比较好看的打印格式,那么就可以在类内部定义一个str()方法

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

但是,不用print()直接打印还是不好看:

>>> Student('Luffy')
<__main__.Student object at 0x0000000001E828D0>

因为显示打印调用的不是str()方法,而是repr()方法,如果想不通过print()就能显示实例变量,在类内部添加repr()方法即可,一般repr()方法和str()方法是一样的,直接把str赋值给repr即可

>>> class Student(object):
...     def __init__(self, name):
...             self.name = name
...     def __str__(self):
...             return 'name:%s' % self.name
...     __repr__ = __str__
...
>>> Student('Luffy')
name:Luffy
>>>
3、iter

如果我们想像list、tuple那样用for循环迭代一个类对象,可以在类内部定义一个iter()方法,并且定义一个next()方法;因为Python的for循环会不断调用该迭代对象的next()方法拿到循环的下一个值,直到遇到StopIteration错误时退出循环。

>>> class Fib(object):
...     def __init__(self):
...             self.a, self.b = 0, 1
...     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
...
17711
28657
4、getitem

根据上面的iter()方法,我们可以类似list、tuple用for循环,但是却还不能如list一样根据下标获取元素:

>>> f = Fib()
>>> f[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'Fib' object does not support indexing

此时,我们可以在类内部定义一个getitem()方法

>>> class Fib(object):
...     def __getitem__(self, n):
...             a, b = 1, 1
...             for x in range(n):
...                     a, b = b, a + b
...             return a
...
>>> f = Fib()
>>> f[10]
89
>>> f[0]
1
>>>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值