一、工具:
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)
网友评论