动态语言的对象属性

既然都是动态语言,自然python和熟知的JavaScript很像,建一个空对象用来存放所有的数据,看看js:

var data = {};
data.name = 'CooMark';
data.age = 30;

但是在python中这样却不行,说好的动态属性呢?

data = object()
data.name = 'CooMark' # AttributeError: 'object' object has no attribute 'name'

但是像下面这样又是可以的,WTF?

class Developer(object):
    pass

data = Developer()
data.name = 'CooMark'
data.age = 30

python slots

python的__slots__设计是为了节省内存,也可以用于构造安全的类、如果一个类使用了__slots__那么它的属性就不再自由了。

下面举例说明:

  1. 自由属性。
class person(object):
    def __init__(self, name, age):
        self.Name = name
        self.Age = age
    if __name__ =='__main__':
        p = person('jianglex', 100)
        p.ID = 7  # 由于没有使用slots所以属性是自由的,可以自由设置,就算设置前没有声明也没事。
  1. __slots__设置非自由属性
class person(object):
    __slots__=('Name','Age')

    def __init__(self,name,age):
        self.Name=name #注意,__init__的执行在__slots__之后;所以就算在__init__方法里也是不能执行self.ID=007的。
        self.Age=age
    if__name__=='__main__':
      p=person('jiangle',100)
      p.ID=7 #这里会报错,由于我们使用了__slots__来声明属性,所以属性再也不是自由的了。