Python19 __slots__@property

Posted thloveyl

tags:

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

面相对象高级编程:slots、@property

  • 给实例绑定属性和方法:正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性。
    • 代码:
      ```
      #!usr/bin/env/python3
      # -- coding:utf-8 --
      class Student(object):
      pass
      s = Student()

      # 给实例绑定属性
      s.name = "123"
      print(‘name‘ in dir(s)) # 判断实例中是否有name这个属性 dir()返回的是对象里所有的方法和属性
      print(s.name)

      # 定义一个方法与实例进行绑定用
      def do_func(self):
      return ‘me‘

      # 给实例绑定一个方法
      from types import MethodType
      s.get_func = MethodType(do_func,s)
      print(s.get_func())

      # 给一个实例绑定的方法,对另一个实例是不起作用的
      s1 = Student()
      # print(s1.name,s1.get_func())

      # 给类绑定方法
      Student.get_func1 = do_func

      # 实例调用类方法
      print(s.get_func1(),s1.get_func1())

      # 使用__slots__ 限制能绑定的属性
      class Plepeo(object):
      slots = (‘name‘,‘age‘) # 用tuple定义允许绑定的属性名称

      p = Plepeo()
      p.name = ‘123‘
      p.age = 12
      p.addr = ‘China‘ # 报错:AttributeError: ‘Plepeo‘ object has no attribute ‘addr‘

      # 使用__slots__要注意,__slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的:
      ```
  • @property:是负责把一个方法变成属性调用的Python内置装饰器:
    • 代码:
      ```
      class Student1(object):

        # 把一个getter方法变成属性,只需要加上@property就可以了,
        # 此时,@property本身又创建了另一个装饰器@score.setter,
        # 负责把一个setter方法变成属性赋值,于是,我们就拥有一个可控的属性
        @property
        def get_score(self): # 得到属性值
            return self._score
      
        @get_score.setter
        def set_score(self,score): # 设置属性值
            if not isinstance(score,int):
                raise TypeError('score is int and <= 100')
            if score > 100 and score < 0:
                raise ValueError('score > 0 ,score < 100')
            self._score = score
      s1 = Student1()
      # 使用@property将方法变成属性调用
      s1.set_score = 100
      print(s1.get_score)
      ```
    • 还可以定义只读属性,只定义getter方法,不定义setter方法就是一个只读属性:

以上是关于Python19 __slots__@property的主要内容,如果未能解决你的问题,请参考以下文章

__slots__ 在 Python 中是如何实现的?

8.python之面相对象part.8(__slots__属性)

python进阶五(定制类)5-7 python中__slots__

Python面向对象高级编程-__slots__定制类,枚举

python限定类属性的类属性:__slots__

python限定类属性的类属性:__slots__