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 面向对象高级编程——定制类相关推荐

  1. python 元类 type_python Class:面向对象高级编程 元类:type

    type的用法: 1.普通的type用法:检查类型class my(object): def hello(self, name='world'): print('Hello, %s.' % name) ...

  2. 【Python面向对象进阶④】——定制类

    Python中的魔法方法 @ author: Flyme awei 方法名 说明 __str__ 用于返回对象的描述 __iter__ 使类可以迭代 __getitem__ 按照下标获取类元素,例如l ...

  3. Python面向对象高级编程

    1.__slots__ 通过Types包中的MethodType将外部方法与类对象进行绑定(该方法只能对绑定的对象生效) """a test module"&q ...

  4. Python学习笔记:面向对象高级编程(完)

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  5. Python学习笔记:面向对象高级编程(中上)

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  6. Python学习笔记:面向对象高级编程(中下)

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  7. Python学习笔记:面向对象高级编程(上)

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  8. python高级属性 用法 编程_python高级编程之面向对象高级编程

    1 面向对象编程 面向对象这节比较简单,就稍微总结几个特殊的点. 特殊方法__init__前后分别有两个下划线,__init__方法的第一个参数永远是self,表示创建的实例本身,因此,在__init ...

  9. Python基础之六面向对象高级编程

    '''面向对象高级编程 ''' from enum import Enum'''__slots__限制实例属性定义的属性只对当前类实例起作用,对于继承的子类不起作用''' class Student( ...

最新文章

  1. 【数据库】sqlite中的限制:数据库大小、表数、列数、行数、参数个数、连接数等
  2. 建站常用13种PHP开源CMS比较
  3. Android 开发应该掌握的 Proguard 技巧
  4. sublime text全程指南【转载】
  5. webapp入门到实战_web前端入门到实战:前端高手在CSS 开发效率的必备片段
  6. select2插件设置选中值并显示的问题
  7. 微信小程序后台管理系统(后端)笔记
  8. Ukey双因素身份认证步骤 安当加密
  9. C语言小项目——电子秒表(毫秒级)
  10. 滚动交互引导界面的Ouroboros
  11. Erlang开源20周年:这门编程语言见证了互联网的技术成长
  12. 实习小结·改进代码(解决爆栈问题)
  13. [Gitlab CI/CD] Error loading key “/dev/fd/63“: invalid format
  14. Excel数据分析:美国牛油果销售分析
  15. 无法走进的春天 ——解读海子《面朝大海,春暖花开》
  16. 退出python三种方法
  17. 基于LoRa技术实现MESH组网的LoRaMESH技术简介
  18. 基于JAVA智友少儿编程学习平台计算机毕业设计源码+系统+数据库+lw文档+部署
  19. simulink仿真 短路分析 含三相直流逆差的电力系统三相短路仿真,程序完整
  20. LATEX——两张图并列排列/双栏模板中图片通栏并列布局

热门文章

  1. java8 list map 分组_java8 List转Map,并进行分组过滤求和等操作
  2. linux可以修改日期格式吗,如何在Linux中使用date命令修改日期时间
  3. tsql 正则_sql里的正则表达式
  4. java毕设可以用结构化方法吗,php,java,jsp网络留言薄,怎么实现一个网络留言簿好毕设指导轻松完成...
  5. 高中会考access数据库_Access操作会考复习.doc
  6. cmd执行命令不等待返回值_[CVE20199535] Iterm2命令执行的不完整复现
  7. linux acl库编译与使用,linux的ACL-rds数据删除了可恢复吗?-WinFrom控件库|.net开源控件库|HZHControls官网...
  8. spark pineline流水线+聚类评估函数 小结
  9. LKT系列加密芯片如何预置openssl生成的rsa密钥完成运算(二)
  10. 英语总结系列(二十九):好好学英语