8月31日 tornado新闻项目笔记

2017-09-05  本文已影响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)

上一篇下一篇

猜你喜欢

热点阅读