欢迎加入QQ讨论群258996829
麦子学院 头像
苹果6袋
6
麦子学院

Python学习之__slots__的使用

发布时间:2018-05-14 16:57  回复:0  查看:331   最后回复:2018-05-14 16:57  

本文和大家分享的主要是python__slots__的使用相关内容,一起来看看吧,希望对大家学习python有所帮助。

  正常情况下,当我们定义了一个 class ,创建了一个 class 的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性。先定义 class 

  class Student(object):

  pass

  然后,尝试给实例绑定一个属性:

  class Student(object):

  pass

  s=Student()

  s.name='Lucy'

  print(s.name)

  还可以尝试给实例绑定一个方法:

  def set_age(self,age):

  self.age=agefrom types import MethodTypeclass Student(object):

  pass

  s=Student()# s.name='Lucy'# print(s.name)

  s.set_age=MethodType(set_age,s)

  s.set_age(25)

  print(s.age)

  25

  [Finished in 0.1s]

  但是,给一个实例绑定的方法,对另一个实例是不起作用的:

  s2=Student()

  s2.set_age(25)

  File "/Users/apple/Desktop/getObjectInfo.py", line 56, in

  s2.set_age(25)

  AttributeError: 'Student' object has no attribute 'set_age'

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

  def set_score(self,score):

  self.score=score

  Student.set_score=set_score

  s.set_score(25)

  print(s.score)

  2525

  [Finished in 0.1s]

  给 class 绑定方法后,所有实例均可调用:

  Student.set_score=set_score

  s.set_score(25)print(s.score)

  s2.set_score(50)print(s2.score)

  2550

  [Finished in 0.1s]

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

  使用slots

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

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

  class Student(object):

  __slots__=('name','age')

  然后,我们试试:

  class Student(object):

  __slots__=('name','age')

  s=Student()

  s.name='Lucy'

  s.age=18

  s.score=55

  File "/Users/apple/Desktop/getObjectInfo.py", line 69, in

  s.score=55

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

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

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

  class Student(object):

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

  pass

  s=Student()

  s.name='Lucy'

  s.age=18# s.score=55

  bob=Bob()

  bob.score=999

  print(bob.score)

  999

  [Finished in 0.1s]

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

 

来源:网络

您还未登录,请先登录

热门帖子

最新帖子