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

  • 相关阅读:
    js中局域变量与全局变量的区别
    如何使用ps制作动态图片
    关于html页面中Input(文本框)控件OnChange事件的触发条件
    SQL常用语法汇总
    jsp六个动作详解
    ajax详解
    setTimeout与setTimeinterval的使用
    水晶报表在web应用程序中应用
    js字符串操作
    Documentum之基础(1)
  • 原文地址:https://www.cnblogs.com/cqq-20151202/p/6598085.html
Copyright © 2011-2022 走看看