Python day 9(3) 定制类
2018-06-18 00:29:43来源:未知 阅读 ()
一:__str__(返回用户友好的输出)
1 >>> class Student(object): 2 ... def __init__(self, name): 3 ... self.name = name 4 ... 5 >>> print(Student('Michael')) 6 <__main__.Student object at 0x109afb190> 7 >>> class Student(object): 8 ... def __init__(self, name): 9 ... self.name = name 10 ... def __str__(self): 11 ... return 'Student object (name: %s)' % self.name 12 ... 13 >>> print(Student('Michael')) 14 Student object (name: Michael)
__str__()
返回用户看到的字符串,__repr__()
返回程序开发者看到的字符串。
当我们直接调用Student('Michael'),而不是用print时,依然返回
<__main__.Student object at 0x109afb190>
此时需要再定义一个__repr__(),并且让
__repr__ = __str__
二:__iter__(返回一个迭代对象)
如果一个类想被用于for ... in
循环,类似list或tuple那样,就必须实现一个__iter__()
方法,该方法返回一个迭代对象,然后,Python的for循环就会不断调用该迭代对象的__next__()
方法拿到循环的下一个值,直到遇到StopIteration
错误时退出循环。
1 class Fib(object): 2 def __init__(self): 3 self.a, self.b = 0, 1 # 初始化两个计数器a,b 4 5 def __iter__(self): 6 return self # 实例本身就是迭代对象,故返回自己 7 8 def __next__(self): 9 self.a, self.b = self.b, self.a + self.b # 计算下一个值 10 if self.a > 100000: # 退出循环的条件 11 raise StopIteration() 12 return self.a # 返回下一个值 13 14 >>> for n in Fib(): 15 ... print(n) 16 ... 17 1 18 1 19 2 20 3 21 5 22 ... 23 46368 24 75025
三:__getitem__(对实例求索引/切片等)
下例为求索引的一个__getitem__实现
1 class Fib(object): 2 def __getitem__(self, n): 3 a, b = 1, 1 4 for x in range(n): 5 a, b = b, a + b 6 return a 7 8 >>> f = Fib() 9 >>> f[0] 10 1 11 >>> f[1] 12 1 13 >>> f[2] 14 2 15 >>> f[3] 16 3 17 >>> f[10] 18 89
四:__getattr__
正常情况下,当我们调用类的方法或属性时,如果不存在,就会报错。要避免这个错误,可以写一个__getattr__()
方法,动态返回一个属性。
1 class Student(object): 2 3 def __init__(self): 4 self.name = 'Michael' 5 6 def __getattr__(self, attr): 7 if attr=='score': 8 return 99
当调用不存在的属性时,比如score
,Python解释器会试图调用__getattr__(self, 'score')
来尝试获得属性,这样,我们就有机会返回score
的值:
1 >>> s = Student() 2 >>> s.name 3 'Michael' 4 >>> s.score 5 99
当然也可以返回函数
1 class Student(object): 2 3 def __getattr__(self, attr): 4 if attr=='age': 5 return lambda: 25
只是调用方式要变为:
>>> s.age()
25
只有在没有找到属性的情况下,才调用__getattr__
,已有的属性,比如name
,不会在__getattr__
中查找。
任意调用如s.abc
都会返回None
,这是因为我们定义的__getattr__
默认返回就是None
。要让class只响应特定的几个属性,我们就要按照约定,抛出AttributeError
的错误:
1 class Student(object): 2 3 def __getattr__(self, attr): 4 if attr=='age': 5 return lambda: 25 6 raise AttributeError('\'Student\' object has no attribute \'%s\'' % attr)
这实际上可以把一个类的所有属性和方法调用全部动态化处理了,不需要任何特殊手段。用途:写SDK。
五:__call__
一个对象实例可以有自己的属性和方法,当我们调用实例方法时,我们用instance.method()
来调用。但是,定义一个__call__()
方法,就可以直接对实例进行调用。
1 class Student(object): 2 def __init__(self, name): 3 self.name = name 4 5 def __call__(self): 6 print('My name is %s.' % self.name)
调用方式如下:
1 >>> s = Student('Michael') 2 >>> s() # self参数不要传入 3 My name is Michael.
Callable函数可以判断一个对象是否能够被调用。
1 >>> callable(Student()) 2 True 3 >>> callable(max) 4 True 5 >>> callable([1, 2, 3]) 6 False 7 >>> callable(None) 8 False 9 >>> callable('str') 10 False
Pytho内部还有很多定制类,链接:http://docs.python.org/3/reference/datamodel.html#special-method-names
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- python3基础之“术语表(2)” 2019-08-13
- python3 之 字符串编码小结(Unicode、utf-8、gbk、gb2312等 2019-08-13
- Python3安装impala 2019-08-13
- 小白如何入门 Python 爬虫? 2019-08-13
- python_字符串方法 2019-08-13
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash