阿里山QQ

导航

使用__slots__限制实例的属性

1.给实例化的对象添加新的属性

看下面一段代码,然后给实例化的对象s添加或者修改属性

class Student(object):
    name='china'

s = Student()
s1=Student()

s.name = 'Charles'
s.age=20
print s.name
print s1.name
print s.age

结果:
Charles
china
20

可以看到:实例的属性可以被修改或者添加

2、使用__slots__限制只有指定的属性才可以被实例添加

将可以被实例化的对象修改的属性添加到内置函数__slots__后面的元祖中,表示只有当属性存在于该元祖中时,该属性才可以在对象中被添加,但是不能修改(如果该属性已经存在于类中);

class Student(object):
    __slots__=('name','age')
    # gender='female'
    # name='china'
    # age = 30

s = Student()
s1=Student()
s.name = 'Charles'
s.age=20
print s.name

# print s1.name
print s.age
# s.gender='male'

在上述代码中s/s1能够添加的属性只有name和age,但是,如果name或者age已经存在于Student类中,那么就不能再s/s1中添加了,否则会报属性错误;

 

3、在类的继承中使用__slots__限制实例化对象的属性

创建一个Primary_Student类,继承Student类,然后实例化Primary_Student

class Student(object):
    __slots__=('name','age')

class PrimaryStudent(Student):
    pass
s2 = PrimaryStudent()
s2.name = 'eric'
s2.genger='male'
print s2.name
print s2.genger

上述代码显示正常

如果我们再在子类中定义__slots__方法呢?

class Student(object):
    __slots__=('name','age')

class PrimaryStudent(Student):
    __slots__ = ('gender')
s2 = PrimaryStudent()
s2.name = 'eric'
s2.gender='male'
s2.grade=80
print s2.name
print s2.gender

上述代码在执行到s2.grade=80的时候报属性错误

 

好了,做到这儿,我们就可以总结一下了

1、类的属性(之前有教程叫做字段,只有包含@装饰器property的方法称为属性,这里就统一叫做属性吧),可以被实例化的对象添加新的属性以及修改属性的值;

2、可以使用__slots__方法,实现只有属性存在于该方法后面的元祖中的时候,在可以被对象添加,如果字段不存在于元祖中,那么该属性只能被对象访问;

3、如果在父类中存在__slots__方法,父类中__slots__对属性的限制不会继承到子类中,但是如果子类中也定义了__slots__方法,那么子类的属性的限制就会继承父类的__slots__,并加上子类的__slots__;

 

参考地址:http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143186739713011a09b63dcbd42cc87f907a778b3ac73000

 

posted on 2017-03-22 09:14  阿里山QQ  阅读(230)  评论(0编辑  收藏  举报