Python 面向对象高级编程——定制类
1.1 定制类
1.1.1 __str__
>>> class Student(object):
... def __init__(self, name):
... self.name = name
...
>>> s = Student('daidai')
>>> s.name
'daidai'
>>> Student('daidai').name
'daidai'
>>> print(Student('daidai')) --发现这样打印并不好看
<__main__.Student object at0x2ac5ebc99128>
>>> class Student(object):
... def __init__(self, name):
... self.name = name
... def __str__(self):
... return 'Student object (name: %s)' %self.name
...
>>> print(Student('daidai'))
Student object (name: daidai)
>>> s = Student('daidai')
>>> s --指向变量后,仍然不好看
<__main__.Student object at0x2ac5ebc99160>
>>> s.name
'daidai'
将__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('daidai'))
Student object (name: daidai)
>>> s = Student('daidai')
>>> s.name
'daidai'
>>> s
Student object (name: daidai)
1.1.2 __iter__
如果一个类想被用于for ... in循环,类似list或tuple那样,就必须实现一个__iter__()方法,该方法返回一个迭代对象,然后,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 > 10000: #退出循环条件
... raiseStopIteration();
... return self.a #返回下一个值
...
>>> for n in Fib():
... print(n)
...
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
1.1.3 __getitem__
上述Fib实例感觉和list类似,但是并不能通过下标来取元素。
通过__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[0]
1
>>> f[4]
5
>>> f[88]
1779979416004714189
1.1.4 __getattr__
正常情况下,当我们调用类的方法或属性时,如果不存在,就会报错。
>>> class Student(object):
... def __init__(self):
... self.name = 'daidai'
...
>>> s = Student()
>>> print(s.name)
daidai
>>> print(s.score)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has noattribute 'score'
加上__getattr__动态返回属性值
>>> class Student(object):
... def __init__(self):
... self.name = 'daidai'
... def __getattr__(self, attr): --当输入score不存在时,python动态调用这个方法
... if attr == 'score':
... return 98
...
>>> s = Student()
>>> s.name
'daidai'
>>> s.score
98
__getattr__返回函数也是可行的
>>> class Student(object):
... def __getattr__(self, attr):
... if attr == 'age':
... return lambda : 24
...
>>> s = Student()
>>> s.age
<functionStudent.__getattr__.<locals>.<lambda> at 0x2ac5ebc8e730>
>>> s.age()
24
只有在没有找到属性的情况下,才调用__getattr__,已有的属性,比如name,不会在__getattr__中查找。
>>> class Student(object):
... def __getattr__(self, attr):
... if attr == 'age':
... return lambda : 24
... raise AttributeError('\'Student\' object has no attribute \'%s\'' %attr)
...
>>>
>>> s = Student()
>>> s.name
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 5, in __getattr__
AttributeError: 'Student' object has noattribute 'name'
>>> s.age
<functionStudent.__getattr__.<locals>.<lambda> at 0x2ac5ebc8e488>
>>> s.age()
24
1.1.5 __call__
__call__方法能实现直接在实例本身上调用。
>>> class Student(object):
... def __init__(self, name):
... self.name = name
... def __call__(self):
... print('My name is %s.' % self.name)
...
>>> s = Student('daidai')
>>> s
<__main__.Student object at0x2ac5ebc99748>
>>> s() --直接实例对象调用
My name is daidai.
可通过callable判断对象是否可调用
>>>callable(Student('daidai'))
True
>>> callable(max)
True
>>> callable((1, 2, 3))
False
>>> callable('str')
False
__call__也可传入参数
>>> class Student(object):
... def __init__(self, name):
... self.name = name
... def __call__(self, others):
... print('My name is %s, %s' %(self.name, others))
...
>>>
>>> s = Student('daidai')
>>> s('so handsome.')
My name is daidai, so handsome.
转载于:https://blog.51cto.com/90sirdb/1826210
Python 面向对象高级编程——定制类相关推荐
- python 元类 type_python Class:面向对象高级编程 元类:type
type的用法: 1.普通的type用法:检查类型class my(object): def hello(self, name='world'): print('Hello, %s.' % name) ...
- 【Python面向对象进阶④】——定制类
Python中的魔法方法 @ author: Flyme awei 方法名 说明 __str__ 用于返回对象的描述 __iter__ 使类可以迭代 __getitem__ 按照下标获取类元素,例如l ...
- Python面向对象高级编程
1.__slots__ 通过Types包中的MethodType将外部方法与类对象进行绑定(该方法只能对绑定的对象生效) """a test module"&q ...
- Python学习笔记:面向对象高级编程(完)
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- Python学习笔记:面向对象高级编程(中上)
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- Python学习笔记:面向对象高级编程(中下)
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- Python学习笔记:面向对象高级编程(上)
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- python高级属性 用法 编程_python高级编程之面向对象高级编程
1 面向对象编程 面向对象这节比较简单,就稍微总结几个特殊的点. 特殊方法__init__前后分别有两个下划线,__init__方法的第一个参数永远是self,表示创建的实例本身,因此,在__init ...
- Python基础之六面向对象高级编程
'''面向对象高级编程 ''' from enum import Enum'''__slots__限制实例属性定义的属性只对当前类实例起作用,对于继承的子类不起作用''' class Student( ...
最新文章
- 【数据库】sqlite中的限制:数据库大小、表数、列数、行数、参数个数、连接数等
- 建站常用13种PHP开源CMS比较
- Android 开发应该掌握的 Proguard 技巧
- sublime text全程指南【转载】
- webapp入门到实战_web前端入门到实战:前端高手在CSS 开发效率的必备片段
- select2插件设置选中值并显示的问题
- 微信小程序后台管理系统(后端)笔记
- Ukey双因素身份认证步骤 安当加密
- C语言小项目——电子秒表(毫秒级)
- 滚动交互引导界面的Ouroboros
- Erlang开源20周年:这门编程语言见证了互联网的技术成长
- 实习小结·改进代码(解决爆栈问题)
- [Gitlab CI/CD] Error loading key “/dev/fd/63“: invalid format
- Excel数据分析:美国牛油果销售分析
- 无法走进的春天 ——解读海子《面朝大海,春暖花开》
- 退出python三种方法
- 基于LoRa技术实现MESH组网的LoRaMESH技术简介
- 基于JAVA智友少儿编程学习平台计算机毕业设计源码+系统+数据库+lw文档+部署
- simulink仿真 短路分析 含三相直流逆差的电力系统三相短路仿真,程序完整
- LATEX——两张图并列排列/双栏模板中图片通栏并列布局
热门文章
- java8 list map 分组_java8 List转Map,并进行分组过滤求和等操作
- linux可以修改日期格式吗,如何在Linux中使用date命令修改日期时间
- tsql 正则_sql里的正则表达式
- java毕设可以用结构化方法吗,php,java,jsp网络留言薄,怎么实现一个网络留言簿好毕设指导轻松完成...
- 高中会考access数据库_Access操作会考复习.doc
- cmd执行命令不等待返回值_[CVE20199535] Iterm2命令执行的不完整复现
- linux acl库编译与使用,linux的ACL-rds数据删除了可恢复吗?-WinFrom控件库|.net开源控件库|HZHControls官网...
- spark pineline流水线+聚类评估函数 小结
- LKT系列加密芯片如何预置openssl生成的rsa密钥完成运算(二)
- 英语总结系列(二十九):好好学英语