array和bytes的转换

  - 每个array必须有一个type_code,以此为依据解析底层字节序列

  - array有一个frombytes方法,可以把字节序列按type_code转换成Array

  - bytes构造函数接受一个可迭代对象作为参数,它依次遍历可迭代对象,将每个元素按其本身的数据类型拆成字节

from array import array

def create_bytes():

    type_code = 'f'

    # ord函数返回字符的编码
print('type_code:',ord(type_code)) ar = array(type_code,[0.19,0.23]) # bytes构造函数接受一个可迭代对象作为参数
# 它依次遍历可迭代对象,将每个元素拆成字节
# type_code1个字节,float4个字节,一共9个字节
by = bytes([ord(type_code)]) + bytes(ar) print('bytes(len:%d):' % len(by), by) return by def from_bytes(by): # 将第一个字节转换为字符
type_code = chr(by[0]) # 以后的每4个字节转换为一个float
# 先用type_code构造一个Array
arr = array(type_code)
# 再把字节序列按type_code转换成Array
arr.frombytes(by[1:]) print(arr) bytes = create_bytes() from_bytes(bytes) 输出:
type_code: 102
bytes(len:9): b'f\\\x8fB>\x1f\x85k>'
array('f', [0.1899999976158142, 0.23000000417232513])

classmethod和staticmethod

class Demo:

    @classmethod
def klassmethod(*args):
print(args) @staticmethod
def statmethod(*args):
print(args) # classmethod自动将类作为第一个参数传入
Demo.klassmethod()
Demo.klassmethod('param') # staticmethod只是定义在类中的一个普通方法
Demo.statmethod()
Demo.statmethod('param') 输出:
(<class '__main__.Demo'>,)
(<class '__main__.Demo'>, 'param')
()
('param',)

对象散列相关方法

  - 首先要保证对象不可变

  - 其次要实现hash和eq方法

class Vector2d:

    def __init__(self,_x,_y):

        self._x = float(_x)
self._y = float(_y) def __iter__(self): return (item for item in (self.x,self.y)) # 用propery装饰器设置只读属性,保持对象的不可变
@property
def x(self): return self._x @property
def y(self): return self._y # 使对象可散列
def __hash__(self): return hash(self.x) ^ hash(self.y) # 可散列的同时,还要实现相等方法
def __eq__(self, other): return self.x == other.x and self.y == other.y v1 = Vector2d(3,4) v2 = Vector2d(3,4) print(hash(v1),hash(v2),v1==v2) 输出:
7 7 True

Python的私有属性

class Dog:

    def __init__(self,name):

        # 如果以__var的形式命名实例属性,Python会把属性名存入实例的__dict__属性中
# 而且会在前面加上一个下划线和类名
self.__name = name dog = Dog('Bob') print(dog.__dict__) # 'Dog' object has no attribute '__name'
# print(dog.__name) print(dog._Dog__name) 输出:
{'_Dog__name': 'Bob'}
Bob

使用__slots__类属性

  - 用法

    - 创建__slots__类属性,把值设置为一个属性名称(字符串)构成的可迭代对象

  - 好处:

    - 可以避免使用消耗内存的__dict__属性,从而节约内存

    - 不允许实例动态创建其他的属性

class Vector2d:

    __slots__ = ('_x','_y')

    def __init__(self,_x,_y):

        self._x = float(_x)
self._y = float(_y) v2d = Vector2d(1,2) # 'Vector2d' object has no attribute '__dict__'
# print(v2d.__dict__) # 'Vector2d' object has no attribute 'z'
# v2d.z = 'z'

  - 注意点

    - 如果把 '__dict__' 这个名称添加到__slots__中,实例会在元组中保存各个实例的属性,此外还支持动态创建属性

    - 为了让对象支持弱引用,需要再__slots__中放__weakref__属性

    - 每个子类要定义自己的__slots__属性,继承无效

class Vector2d:

    __slots__ = ('_x','_y','__dict__')

    def __init__(self,_x,_y):

        self._x = float(_x)
self._y = float(_y) v2d = Vector2d(1,2) v2d.z = 'z' print(v2d.__dict__) 输出:
{'z': 'z'}

符合Python风格的对象的更多相关文章

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

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

  2. python 符合Python风格的对象

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 25.0px Helvetica } 对象表示形式 每门面向对象的语言至少都有一种获取对象的字符串表示形式的 ...

  3. 流畅的python第九章符合Python风格的对象学习记录

    对象表示形式 每门面向对象的语言至少都有一种获取对象的字符串表示形式的标准方式.Python提供了两种方式 repr()便于开发者理解的方式返回对象的字符串表示形式 str()便于用户理解的方式返回对 ...

  4. 流畅的python 符合python风格的对象

    对象表示形式 每门面向对象的语言至少都有一种获取对象的字符串表示形式的标准方式.Python 提供了两种方式. repr() 以便于开发者理解的方式返回对象的字符串表示形式.str() 以便于用户理解 ...

  5. 流畅的python学习笔记:第九章:符合python风格的对象

    首先来看下对象的表现形式: class People():     def __init__(self,name,age):         self.name=name         self.a ...

  6. Fluent_Python_Part4面向对象,09-pythonic-obj,Python风格的对象

    第四部分第9章,Python风格的对象 这一章接第1章,说明常见的特殊方法实现. 本章包括以下话题: 支持用于生成对象其它表示形式的内置函数(如repr().bytes(),等等) 使用一个类方法实现 ...

  7. 第8.25节 Python风格的__getattribute__属性访问方法语法释义及使用

    一. 引言 在<第8.13节 Python类中内置方法__repr__详解>老猿介绍了在命令行方式直接输入"对象"就可以调用repr内置函数或__repr__方法查看对 ...

  8. Python风格规范

    Python风格规范 分号 Tip 不要在行尾加分号, 也不要用分号将两条命令放在同一行. 行长度 Tip 每行不超过80个字符 例外: 长的导入模块语句 注释里的URL 不要使用反斜杠连接行. Py ...

  9. PYTHON风格规范-Google 开源项目风格指南

    Python风格规范 分号 Tip 不要在行尾加分号, 也不要用分号将两条命令放在同一行. 行长度 Tip 每行不超过80个字符 例外: 长的导入模块语句 注释里的URL 不要使用反斜杠连接行. Py ...

随机推荐

  1. DropDownList控件的使用方法

    1. 使用代码添加数据 <asp:DropDownList ID="DropDownList1" runat="server"> </asp: ...

  2. 分析一则halcon抓边拟合直线的小案例

    例图: 完整算法: read_image (Image, 'C:/Users/Administrator/Desktop/1.png') threshold (Image, Regions, , ) ...

  3. 使用MySQLMTOP监控MySQL性能

    一.服务器角色 服务器角色 172.18.35.29 10.160.22.14 (MySQL Master) 10.160.22.47 (MySQL Slave) 监控点 YES NO NO 被监控点 ...

  4. windows安装mysql-5.7压缩版详细教程

    前言 今天安装mysql数据库,进入mysql官网,对于windows来说有两个版本的文件可下载,一是.msi安装文件,二是.biz压缩包.以前一直用安装文件进行安装,百试不爽.今天突然不想用安装文件 ...

  5. [Selenium] 怎样判断是否适合自动化测试

    实施自动化测试前需要对软件开发过程进行分析,以观察其是否适合使用自动化测试.通常需要满足以下条件: 1)需求变动不频繁 2)项目周期足够长 3)自动化测试脚本可重复使用 4)手工测试无法完成或者需要大 ...

  6. 《Forward团队-爬虫豆瓣top250项目-开发文档》

    码云地址:https://github.com/xyhcq/top250 模块功能:获取豆瓣top250网页的源代码,并分析. def getHTMLText(url,k): # 获取网页源代码 tr ...

  7. git fatal:HttpRequestException encountered

    网上查了一下发现是Github 禁用了TLS v1.0 and v1.1,必须更新Windows的git凭证管理器,才行. https://github.com/Microsoft/Git-Crede ...

  8. Hdu1429 胜利大逃亡(续) 2017-01-20 18:33 53人阅读 评论(0) 收藏

    胜利大逃亡(续) Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Subm ...

  9. NETCore 同步AD域组织和用户

    BitAdminCore为没有自主开发框架的小团队,提供快速项目搭建及开发能力. 框架演示:http://bit.bitdao.cn 框架源码:https://github.com/chenyinxi ...

  10. Android App的破解技术有哪些?如何防止反编译?

     现在最流行的App破解技术大多是基于一定相关技术的基础:如一定阅读Java代码的能力.有一些Android基础.会使用eclipse的一些Android调试的相关工具以及了解一些smali的语法规范 ...