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. 单源最短路:Dijkstra算法 及 关于负权的讨论

    描述: 对于图(有向无向都适用),求某一点到其他任一点的最短路径(不能有负权边). 操作: 1. 初始化: 一个节点大小的数组dist[n] 源点的距离初始化为0,与源点直接相连的初始化为其权重,其他 ...

  2. 复利计算--web版--总结--软件工程

    复利计算项目 估计用时 实际用时 时间(小时) 5.5小时  6.5小时 总共代码行 500  550 功能包含 单利/复利计算,本金计算,求投资年限,求投资项目利率估计 (计算利息和,计算时间,计算 ...

  3. sed修改json内容

    1.config.json { "whiteHoleUrl": "http://172.16.80.90/whui/serviceManagement/regist/ne ...

  4. Forward团队-爬虫豆瓣top250项目-模块测试过程

    我所做的模块不需要测试,但在后续其他人编写代码的时候,我需要对网页源码进行进一步的规范,然后指导别人在网页源码中的标签用法.

  5. python + selenium + Js 处理轮动条

    selenium并不是万能的,有时候页面上操作无法实现的,这时候就需要借助JS来完成了. 常见场景: 当页面上的元素超过一屏后,想操作屏幕下方的元素,是不能直接定位到,会报元素不可见的. 这时候需要借 ...

  6. shell 脚本 随机抽取班上学生

    #!/bin/bash # jw=('王浩' '谢云生' '黄科杨' '何星宇' '张宸兵' '邓培林' '刘桃' '杨沛东' '楚齐文' '咸鱼' '杨东' '>黄庭辉' '郑少文' '师靖' ...

  7. Oracle E-Business Suite R12.2的新技术特点

    Oracle公司的系统研发开发与执行效率,让人不得不佩服.从2008年1月收购BEA到现在短短几年时间,就把Bea WebLogic产品融合到了Oracle公司自己的原研发产品之庞大的Oracle E ...

  8. .NET框架源码解读之MYC编译器

    在SSCLI里附带了两个示例编译器源码,用来演示CLR整个架构的弹性,一个是简化版的lisp编译器,一个是简化版的C编译器.lisp在国内用的少,因此这里我们主要看看C编译器的源码,源码位置是:\ss ...

  9. 使用testNGListenter来自定义日志

    背景 用testNG写用例的时候,只是打印了请求的日志,没有打印这个用例的开始和结束的标识,想加上这个标识这样更好的排查问题 这种日志是加在用例开始执行和结束,相当于spring中的AOP功能,今天翻 ...

  10. windows服务安装记录

    首先打开cmd. 进入这个地址 C:\Windows\Microsoft.NET\Framework\v4.0.30319 执行操作  InstallUtil.exe E:\QueueWinServi ...