zoukankan      html  css  js  c++  java
  • python面向对象__slots__变量的运用

    大家都知道,类创建实例的时候,可以给这个实例添加属性,而__slots__的作用就是限制我们能添加哪些属性,写一个简单的例子。

    class Student(object):
      __slots__=('name','age')
    s=Student()
    s.name='MR.xu'
    s.age=22
    s.core=30

    运行结果 我们会得到一个错误:AttributeError: 'Student' object has no attribute 'score'  提示我们没有score这个属性,结果就是,name是age这两个属性被添加了,而score被拒绝

    这个时候我们再创建一个Student的子类 Student2

    class Student2(Student):
      pass 
    s2=Student2()
    s2.name='MR.lee'

    s2.score=100

    s2.age=22

    print(s2.name,s2.age,s2.score)

    运行结果为

    MR.xu 22 100

    可以看出,虽然我们继承了Student类,但是并没有继承他的__slots__变量,我们可以给Student2的实例添加任何属性,那我们再给Student2定义一个__slots__变量看看

    class Student2(Student):
      __slots__=('grade') 
    s2=Student2()

    s2.name='MR.xu'
    print(s2.name)
    s2.age=22
    print(s2.age)
    s2.score=100
    print(s2.score)
    s2.grade='大一'
    print(s2.grade)

    在这里,我们给Student2这个类中添加了__slots__变量值为grade,并给实例s2添加了grade属性

    我们来看下分别运行的结果运行结果:

    s2.name='MR.xu'
    print(s2.name)

    MR.xu

    ---------------------------------

    s2.age=22
    print(s2.age)

    22

    ---------------------------------

    s2.score=100
    print(s2.score)

    AttributeError: 'Student2' object has no attribute 'score'

    ---------------------------------

    s2.grade='大一'
    print(s2.grade)

    大一

    grade,name,age三个属性都成功添加,唯独score没有,原因就是子类如果定义了__slots__变量,那么他就允许创建自己本身(Student2)的__slots__变量和它的父类(Student)的

    __slots__变量。即子类(Student2)的实例(s2)允许创建(‘grade’,'name','age')三个属性

  • 相关阅读:
    里氏代换原则
    依赖倒转原则
    开放-封闭原则
    如何判断对象是否死亡和类是无用的类
    Java内存区域
    Zookeeper使用场景
    zookeeper知识点总结
    前端小技术总结
    lambda表达式的使用
    Comparator进行List集合排序
  • 原文地址:https://www.cnblogs.com/bidepanpan/p/7097748.html
Copyright © 2011-2022 走看看