码迷,mamicode.com
首页 > 编程语言 > 详细

Python19 __slots__、@property

时间:2019-09-01 23:30:07      阅读:107      评论:0      收藏:0      [点我收藏+]

标签:ror   pytho   odi   ``   ret   prope   情况下   strong   student   

面相对象高级编程: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

标签:ror   pytho   odi   ``   ret   prope   情况下   strong   student   

原文地址:https://www.cnblogs.com/thloveyl/p/11444203.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!