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 简洁了很多,处理效果完全一样。

 

posted @ 2021-03-04 17:19  XiaoLee-C  阅读(1391)  评论(1编辑  收藏  举报