Python day 9(3) 定制类

栏目: Python · 发布时间: 6年前

内容简介:Python day 9(3) 定制类

一:__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


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

与孩子一起学编程

与孩子一起学编程

[美] 桑德Warren Sande、Carter Sande / 苏金国、姚曜 等 / 人民邮电出版社 / 2010-11 / 65.00元

一本老少咸宜的编程入门奇书!一册在手,你完全可以带着自己的孩子,跟随Sande父子组合在轻松的氛围中熟悉那些编程概念,如内存、循环、输入和输出、数据结构和图形用户界面等。这些知识一点儿也不高深,听起来备感亲切,书中言语幽默风趣而不失真义,让学习过程充满乐趣。细心的作者还配上了孩子们都喜欢的可爱漫画和经过运行测试的程序示例,教你用最易编写和最易理解的Python语言,写出你梦想中的游戏程序。 ......一起来看看 《与孩子一起学编程》 这本书的介绍吧!

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试