对象表示形式

每门面向对象的语言至少都有一种获取对象的字符串表示形式的标准方式。Python提供了两种方式

repr()便于开发者理解的方式返回对象的字符串表示形式

str()便于用户理解的方式返回对象的字符串表示形式

要实现__repr__,__str__特殊方法为repr(),str()提供支持

classmethod和staticmethod

classmethod通常用来定义操作类,而不是操作实例的方法。改变了调用方法的方式,因此,类方法的第一个参数是类本身,而不是实例,classmethod最常见的用途是定义备选构造方法

staticmethod装饰器也会改变方法的调用方式,但是第一个参数不是特殊的值,其实,静态方法就是普通的函数,只是碰巧在类的定义体中,而不是在模块层中定义。

格式化显示

自定义__format__方法,如果没有定义,会返回从object继承的str(my_object)方法

可散列

自定义__hash__方法和__eq__方法

Python的私有属性和受保护的属性

python不能像java那样使用private修饰符创建私有属性,但是有个简单的机制可以避免子类意外覆盖私有属性

使用__slots__类属性节省空间

覆盖类属性

  1. from array import array
  2. import math
  3.  
  4. class Vector2d:
  5. typecode = 'd'
  6.  
  7. def __init__(self, x, y):
  8. self.__x = float(x)
  9. self.__y = float(y)
  10.  
  11. @property
  12. def x(self):
  13. return self.__x
  14.  
  15. @property
  16. def y(self):
  17. return self.__y
  18.  
  19. def __iter__(self):
  20. return (i for i in (self.x, self.y))
  21.  
  22. def __repr__(self):
  23. class_name = type(self).__name__
  24. return '{}({!r}, {!r})'.format(class_name, *self)
  25.  
  26. def __str__(self):
  27. return str(tuple(self))
  28.  
  29. def __bytes__(self):
  30. return (bytes([ord(self.typecode)]) + bytes(array(self.typecode, self)))
  31.  
  32. def __eq__(self, other):
  33. return tuple(self) == tuple(other)
  34.  
  35. def __abs__(self):
  36. return math.hypot(self.x, self.y)
  37.  
  38. def __bool__(self):
  39. return bool(abs(self))
  40.  
  41. def __format__(self, format_spec=''):
  42. if format_spec.endswith('p'):
  43. format_spec = format_spec[:-1]
  44. coords = (abs(self), self.angle())
  45. outer_fmt = '<{}, {}>'
  46. else:
  47. coords = self
  48. outer_fmt = '({}, {})'
  49. components = (format(c, format_spec) for c in coords)
  50. return outer_fmt.format(*components)
  51.  
  52. def __hash__(self):
  53. return hash(self.x) ^ hash(self.y)
  54.  
  55. def angle(self):
  56. return math.atan2(self.y, self.x)
  57.  
  58. @classmethod
  59. def frombytes(cls, octets):
  60. typecode = chr(octets[0])
  61. memv = memoryview(octets[1:]).cast(typecode)
  62. return cls(*memv)

流畅的python第九章符合Python风格的对象学习记录的更多相关文章

  1. 流畅的python第九章笔记 python风格的python

    9.1对象表示形式 __repr__和__str__这两个方法都是用于显示的,__str__是面向用户的,而__repr__面向程序员. 我们打印下面的A是默认输出这个对象的类型,我们对B进行了修改_ ...

  2. 第9章 符合Python风格的对象

    #<流畅的Python>读书笔记 # 第9章 符合Python风格的对象 # 本章包含以下话题: # 支持用于生成对象其他表示形式的内置函数(如repr().bytes(),等等) # 使 ...

  3. 第九章、python文件的两种用途

    目录 第九章.python文件的两种用途 一.用途 第九章.python文件的两种用途 一.用途 当前运行的文件(脚本) 被导入的文件(模块) # aaa.py x = 1 def f1(): pri ...

  4. 第九章:Python高级编程-Python socket编程

    第九章:Python高级编程-Python socket编程 Python3高级核心技术97讲 笔记 9.1 弄懂HTTP.Socket.TCP这几个概念 Socket为我们封装好了协议 9.2 cl ...

  5. 流畅的python第七章函数装饰器和闭包学习记录

    本章讨论的话题 python如何计算装饰器句法 python如何判断变量是不是局部的(通过函数内部是否给变量赋值过来判断是否是局部变量) 闭包存在的原因和工作原理(闭包是一种函数,它会保留定义函数时存 ...

  6. Python第九章模块和包(2)

    1.如果文件下没有__init__.py文件,程序将不会认为这是一个Python的包. 2.如果要使用from 包  import  *  则需要 这样做. 是模块中包含 方法 的文件没有包含类: # ...

  7. Python第九章模块和包

    1.import Python文件的时候文件名不能跟Python中自带的关键字重复,否则无法使用关键字的方法. 2.Reload(),重载例子 import sysreload(sys)sys.set ...

  8. 第九章:Python の 网络编程基础(一)

    本課主題 何为TCP/IP协议 初认识什么是网络编程 网络编程中的 "粘包" 自定义 MySocket 类 本周作业 何为TCP/IP 协议 TCP/IP协议是主机接入互网以及接入 ...

  9. python第九章:面向对象--小白博客

     面向对象介绍 一.面向对象和面向过程 面向过程:核心过程二字,过程即解决问题的步骤,就是先干什么后干什么 基于该思想写程序就好比在这是一条流水线,是一种机械式的思维方式 优点:复杂的过程流程化 缺点 ...

随机推荐

  1. Disruptor Ringbuffer

    系列译文: http://ifeve.com/disruptor/ 当有多个消费者时,(按Disruptor的设计)每个消费者各自控制自己的指针,依次读取每个Slot(也就是每个消费者都会读取到所有的 ...

  2. Django如何从Model中获取字段名称——verbose_name

    一.背景 CRM项目重新总结一下,重写之前的项目发现有不少知识点已经忘记,所以特此来重新总结一下一便后续能够回忆起 二.代码分析 1. 核心代码 from django.conf.urls impor ...

  3. Python Flask 蓝图Blueprint

    1. 目录结构 2. manage.py类似于django中manage import fcrm if __name__ == '__main__': fcrm.app.run(port=8001) ...

  4. Linus 谈软件开发管理经验

    原文出处: linuxtoday   译文出处:CSDN // 伯乐在线转注:英文原文写于 2011 年 导读:没有人比Linus Torvalds更了解软件开发项目管理中的酸甜苦辣了.作为Linux ...

  5. Android studio 导入工程 出现错误

    原文:http://blog.csdn.net/qazzxc111/article/details/48787419 对于刚开始使用Android studio 并且以前不了解gradle,IDE之类 ...

  6. STL模板整理 全排列

    概念: 从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列.当m=n时所有的排列情况叫全排列.如果这组数有n个,那么全排列数为n!个. 比如a, ...

  7. Codeforces 1082 C. Multi-Subject Competition-有点意思 (Educational Codeforces Round 55 (Rated for Div. 2))

    C. Multi-Subject Competition time limit per test 2 seconds memory limit per test 256 megabytes input ...

  8. 2017CCPC 杭州 J. Master of GCD【差分标记/线段树/GCD】

    给你一个n个初始元素都为1的序列和m个询问q. 询问格式为:l r x(x为2or3) 最后求1~n所有数的GCD GCD:把每个数分别分解质因数,再把各数中的全部公有质因数提取出来连乘,所得的积就是 ...

  9. shell中的特殊变量

    常见的特殊变量: $* 和 $@ 的区别: 1. 在这两个变量没有被双引号""引起来的时候,它们没有区别. 2. 在这两个变量被双引号""引起来的时候,&quo ...

  10. VMware Workstation虚拟机进入BIOS

    1.<F2>键 2.