• 【python】类中__slots__使用


    当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性.实例绑定的方法,对另一个实例是不起作用的

    class Student(object):
        pass
    
    s1 = Student()
    s2 = Student()
    s1.name = 'Michael' # 动态给实例绑定一个属性
    print(s1.name)
    #>>>s1.age 
    def set_ageS(self, age): # 定义一个函数作为实例方法
        self.age = age
    
    from types import MethodType
    s1.set_age = MethodType(set_ageS, s1) # 给实例绑定一个方法
    s1.set_age(25) # 调用实例方法
    print(s1.age )
    #>>>25
    
    print(s2.name)
    #>>>报错
    print(s2.age )
    #>>>报错

    为了给所有实例都绑定方法,可以给class绑定方法:

    class Student(object):
        pass
    
    s1 = Student()
    s2 = Student()
    
    
    def set_ageS(self, age): # 定义一个函数
        self.age = age
    
    Student.set_age=set_ageS ##把函数地址传给class,作为类变量
    s1.set_age(25)
    s2.set_age(26)
    print(s1.age)
    #>>>25
    print(s2.age)
    #>>>26
    

    通常情况下,上面的set_age方法可以直接定义在class中,但动态绑定允许我们在程序运行的过程中动态给class加上功能,这在静态语言中很难实现。

    __slots__:

    __slots__作用:限制类的属性,只给实例绑定任何属性和方法

    如果我们想要限制class的属性怎么办?比如,只允许对Student实例添加nameage属性。

    为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class能添加的属性:

    >>> class Student(object):
    ...     __slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称
    ...

    然后,我们试试:

    >>> s = Student() # 创建新的实例
    >>> s.name = 'Michael' # 绑定属性'name'
    >>> s.age = 25 # 绑定属性'age'
    >>> s.score = 99 # 绑定属性'score'
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 'Student' object has no attribute 'score'

    由于'score'没有被放到__slots__中,所以不能绑定score属性,试图绑定score将得到AttributeError的错误。

    使用__slots__要注意,__slots__定义的属性仅对当前类起作用,对继承的子类是不起作用的:

    >>> class GraduateStudent(Student):
    ...     pass
    ...
    >>> g = GraduateStudent()
    >>> g.score = 9999

    除非在子类中也定义__slots__,这样,子类允许定义的属性就是自身的__slots__加上父类的__slots__

  • 相关阅读:
    vue---echarts图表
    路由嵌套
    VoIP语音通话研究【进阶篇(四):freeswitch+webrtc+sip.js的通话】
    VoIP语音通话研究【进阶篇(三):opensips安装】
    如何在北京退休?
    后端分析/前端分析/边缘分析
    使用curl批量下载图片
    pytorch固定随机种子复现实验结果
    分享一个作为面试官的面试思路
    两个流程链路问题的排查和总结
  • 原文地址:https://www.cnblogs.com/paulwinflo/p/5828455.html
Copyright © 2020-2023  润新知