Python:__slots__()方法和@property方法

Posted 良人仍未归~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python:__slots__()方法和@property方法相关的知识,希望对你有一定的参考价值。

#最近在根据廖雪峰老师的python学习教程学习,以下时学习过程中做的一些学习总结

1、__slots__

  1、python作为一个动态语言,可以在创建一个class类后,给类进行绑定属性和方法。但是当我们想要限制实例的属性和方法时怎么办?这个时候就可以用到__slots__()方法。

  无图无真相,直接上代码:

class Student(object):
    __slots__ = (name,age)

  然后我们尝试添加属性:

>>> a = Student()
>>> a.name = bob
>>> a.name
bob
>>> a.age = 25
>>> a.age
25
>>> a.score = 89
Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    a.score = 89
AttributeError: Student object has no attribute score

  可以看出当我们设置(‘name’,‘age‘)属性的值的时候可以正常显示,当时当我们设置score属性出现了报错,这是因为__slots__限制了实例的属性。

  2、__slots__方法限制属性,但是对继承的子类无效

class Demo(Student):
    pass

  添加属性:

>>>g = Demo()
>>>g.score = 99
>>>g.score
99

  使用__slots__时要注意,该方法只对当前类有效,除非在子类中也定义__slots__方法。

2、@property

  @property时python内置的一个装饰器,负责把一个方法变成属性调用。

  @property的实现较为复杂,他首先通过@property把一个getter方法变成一个属性,然后在定义一个@xxx.setter方法对属性进行赋值:

 class Student(object):
  @property          #定义读属性
    def score(self):
        return self._score
    @score_setter        #定义写的属性
    def score(self,value):
        self._score=value
    @property
    def  grade(self):                    
        return self._score*2            

  从上面例子可以看出,@property也可以只定义getter方法,如上grade()函数就只具备读属性,不可以进行赋值。

  

  

以上是关于Python:__slots__()方法和@property方法的主要内容,如果未能解决你的问题,请参考以下文章

python 动态给实例添加属性和方法并使用__slots__

30.Python面向对象类方法和静态方法动态绑定属性和__slots__限制绑定@property

30.Python面向对象类方法和静态方法动态绑定属性和__slots__限制绑定@property

30.Python面向对象类方法和静态方法动态绑定属性和__slots__限制绑定@property

了解 Python 3.7 中类、namedtuple 和 __slots__ 的大小

使用__slots__