python 效能工具-attr.s
1、attr 一个效能工具,意思是,并不能提供不可取代的功能,但是却能提高我们的编码效率,将一些本来该造轮子操作扔给它,黑箱操作即可。
2、遇到什么问题,我们可以使用这个库?
(1) 打印美观
step1:打印输出的问题用__repr__解决。
- 比如 print 打印一个对象的所有属性,直接print obj 只能输出这个对象的内存地址。
- print obj.__dict__打印出的是一个dict格式的属性,但是属性dict中的顺序不是我们指定的,中文也是uft-8编码的。
如果我想要指定属性输出的顺序,也不想再去做解码呢
可以这样做,重写魔术方法__repr__,指定输出顺序,
class test(): def person(self,name,age,sex): self.name = name self.age = age self.sex = sex def __repr__(self): return '{}(name={},age={},sex={})'.format(self.__class__.__name__,self.name,self.age,self.sex) test1 = test() test2 = test() test1.person("小明",18,"male") test2.person("小明",19,"male") print "__dict__打印:", print test1.__dict__ print "触发__repr__打印:", print test1
对比一下可以发现__dict__是无顺序打印,__repr__重构时是可以指定打印的,也不需要对汉字做解码。
__dict__打印: {'age': 18, 'name': '\xe5\xb0\x8f\xe6\x98\x8e', 'sex': 'male'} 触发__repr__打印: test(name=小明,age=18,sex=male)
ps.需要我们注意的是,何时触发的__repr__(self,xxx,xxx,....)方法?
结论是,输入对象test1,然后回车(没试过);打印test1对象 这两种方式都能自动触发调用__repr__
step2:偷懒一下。如果我连__repr__函数都不想重写呢?毕竟写起来也是真的麻烦
这时候,就可以使用attr.s这个工具了,省去这些繁琐的代码编写过程
import attr class test(): def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex def __repr__(self): return '{}(name={},age={},sex={})'.format(self.__class__.__name__,self.name,self.age,self.sex) test1 = test("小明", 18, "male") print (test1) @attr.s class test_attrs(): name = attr.ib() age = attr.ib() sex = attr.ib() test2 = test_attrs("小明", 18, "male") print (test2)
打印出来是
test(name=小明,age=18,sex=male) test_attrs(name='小明', age=18, sex='male')
对比test类 用__repr__处理的打印,和test_attrs类,用的类装饰器@attr.s 简洁了很多,处理效果完全一样。