美文网首页
8月31日 tornado新闻项目笔记

8月31日 tornado新闻项目笔记

作者: 五行缺觉 | 来源:发表于2017-09-05 11:53 被阅读0次

    一、工具:

    1tornado

    2redis

    3mysql

    二、note1(python的slots)

    python新模式的class,即从object继承下来的类有一个变量是__slots__,slots的作用是阻止在实例化类时为实例分配dict,默认情况下每个类都会有一个dict,通过__dict__访问,这个dict维护了这个实例的所有属性,举例如下

    class base(object):

    v = 1

    def __init__(self):

    pass

    b = base()

    print b.__dict__

    b.x = 2

    print b.__dict__

    运行:

    {}

    {'x':2}

    可见:实例的dict只保持实例的变量,对于类的属性是不保存的,类的属性包括变量和函数。由于每次实例化一个类都要分配一个新的dict,因此存在空间的浪费,因此有了slots,当定义了slots后,slots中定义的变量变成了类的描述符,相当于java,c++中的成员变量声明,类的实例只能拥有这些个变量,而不在有dict,因此也就不能在增加新的变量

    class base(object):

    __slots__ = ('y')

    v = 1

    def __init__(self):

    pass

    b = base()

    print b.__dict__

    b.x = 2              //error,不能增加新的变量

    print b.__dict__

    注意,如果类的成员变量与slots中的变量同名,

    class base(object):

    __slots=('y',)

    y = 2

    v = 1

    def __init__(self):

    pass

    b = base()

    print b.__dict__

    b.x = 2

    b.y = 3 //read only

    print b.__dict__

    目前的实现是该变量被设置为readonly(只读的)!!!

    三、note2(python 的__dict__)

    设想这样一个场景。

    我有一个字典,从某个地方获取的,比如http请求发过来的,比如从redis中hgetall出来的。我要根据这个字典来构建一个对象。

    比如类

    class Person:

    def __init__(self,_obj):

    self.name = _obj['name']

    self.age = _obj['age']

    self.energy = _obj['energy']

    self.gender = _obj['gender']

    self.email = _obj['email']

    self.phone = _obj['phone']

    self.country = _obj['country']

    利用__dict__的特性,上面的类可以用如下的代替,代码量大大减少:

    class Person:

    def __init__(self,_obj):

    self.__dict__.update(_obj)

    相关文章

      网友评论

          本文标题:8月31日 tornado新闻项目笔记

          本文链接:https://www.haomeiwen.com/subject/xmtqjxtx.html