zoukankan      html  css  js  c++  java
  • 使用__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

  • 相关阅读:
    手机号码正则表达式
    POJ 3233 Matrix Power Series 矩阵快速幂
    UVA 11468
    UVA 1449
    HDU 2896 病毒侵袭 AC自动机
    HDU 3065 病毒侵袭持续中 AC自动机
    HDU 2222 Keywords Search AC自动机
    POJ 3461 Oulipo KMP模板题
    POJ 1226 Substrings KMP
    UVA 1455 Kingdom 线段树+并查集
  • 原文地址:https://www.cnblogs.com/cqq-20151202/p/6598085.html
Copyright © 2011-2022 走看看