Python property函数

发布于 2020-05-23  636 次阅读


描述

property() 函数的作用是在新式类中返回属性值。

语法

以下是 property() 方法的语法:

class property([fget[, fset[, fdel[, doc]]]])

参数

  • fget -- 获取属性值的函数
  • fset -- 设置属性值的函数
  • fdel -- 删除属性值函数
  • doc -- 属性描述信息

返回值

返回新式类属性。

实例

class Student:
    def __init__(self, name, math, chinese, english):
        self.name = name
        self.math = math
        self.chinese = chinese
        self.english = english

    def get_math(self):
        return self._math

    def set_math(self, value):
        if 0 <= value <= 100:
            self._math = value
        else:
            raise 'valid value must be in [0,100]'


    def get_chinese(self):
        return self._chinese

    def set_chinese(self, value):
        if 0 <= value <= 100:
            self._chinese = value
        else:
            raise 'valid value must be in [0,100]'

    def get_english(self):
        return self._english


    def set_english(self, value):
        if 0 <= value <= 100:
            self._english = value
        else:
            raise 'valid value must be in [0,100]'

    math=property(get_math, set_math, "", "I'm the 'math' property.")
    chinese=property(get_chinese, set_chinese, "", "I'm the 'chinese' property.")
    english=property(get_english, set_english, "", "I'm the 'english' property.")

    def __repr__(self):
        return '<student:{} ,math:{}, chinese:{}, english:{}>'.format(self.name, self.math, self.chinese, self.english)

将property用做装饰器

@property是一个非常好用的语法糖,@property最大的好处就是在类中把一个方法变成属性调用,起到既能检查属性,还能用属性的方式来访问该属性的作用

class Student:
    def __init__(self, name, math, chinese, english):
        self.name = name
        self.math = math
        self.chinese = chinese
        self.english = english

    @property
    def math(self):
        return self._math

    @math.setter
    def math(self, value):
        if 0 <= value <= 100:
            self._math = value
        else:
            raise 'valid value must be in [0,100]'

    @property
    def chinese(self):
        return self._chinese

    @chinese.setter
    def chinese(self, value):
        if 0 <= value <= 100:
            self._chinese = value
        else:
            raise 'valid value must be in [0,100]'

    @property
    def english(self):
        return self._english

    @english.setter
    def english(self, value):
        if 0 <= value <= 100:
            self._english = value
        else:
            raise 'valid value must be in [0,100]'


    def __repr__(self):
        return '<student:{} ,math:{}, chinese:{}, english:{}>'.format(self.name, self.math, self.chinese, self.english)

这个代码和第一个例子完全相同

  • 利用@property还可以只定义只读属性,既只定义getter方法
  • setter方法可以认为是可写属性

@property实现原理

源码

class property(object):
	def __init__(self, fget=None, fset=None, fdel=None, doc=None):
		“”“
        Property attribute.
        
          fget
            function to be used for getting an attribute value
          fset
            function to be used for setting an attribute value
          fdel
            function to be used for del'ing an attribute
		class C(object):
            @property
            def x(self):
                "I am the 'x' property."
                return self._x
            @x.setter
            def x(self, value):
                self._x = value
            @x.deleter
            def x(self):
                del self._x
  		”“”
 		pass	
     def __set__(self, *args, **kwargs): # real signature unknown
       """ Set an attribute of instance to value. """
       	pass
     def __get__(self, *args, **kwargs): # real signature unknown
	    """ Return an attribute of instance, which is of type owner. """
	    pass
     def __delete__(self, *args, **kwargs): # real signature unknown
        """ Delete an attribute of instance. """
        pass

@property是一个描述符,以后会讲到


一名测试工作者,专注接口测试、自动化测试、性能测试、Python技术。