廖雪峰python学习记录 property到描述符

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiaobai_classmate/article/details/79901060

property

详细参考《python参考手册》
@property装饰器支持以简单属性的形式访问后面的方法,无需像平常一样添加额外的()来调用该方法

  • 对象的使用者很难发现正在计算一个属性
  • 这种访问方式遵循所谓的统一访问原则
  • 不用费力去了解何时添加额外的()
class Circle(object):
    def __init__(self, radius):
        self.radius = radius
    @property
    def area(self):
        return math.pi * (self.radius**2)
    @property
    def perimeter(self):
        return 2 * math.pi * self.radi

执行结果如下

c.area
78.53981633974483
c.perimeter
31.41592653589793


property还可以截获操作权,以设置和删除属性

class Foo(object):
    def __init__(self, name):
        self.__name = name
    @property
    def name(self):
        return self.__name
    @name.setter
    def name(self, value):
        if not isinstance(value,str):
            raise TypeError('Must be a string')
        self.__name = value
    @name.deleter
    def name(self):
        raise TypeError('Can\'t delete name')

测试结果如下:


  • f.name 相当于调用get()
  • f.name = ‘first’ 相当于调用set()

f = property_test.Foo(‘last’)
f.name
‘last’
f.name = ‘first’
f.name
‘first’
f.name = 44
Traceback (most recent call last):
File “”, line 1, in
File “/home/python_test/property_test.py”, line 24, in name
raise TypeError(‘Must be a string’)
TypeError: Must be a string
del f.name
Traceback (most recent call last):
File “”, line 1, in
File “/home/python_test/property_test.py”, line 28, in name
raise TypeError(‘Can\’t delete name’)
TypeError: Can’t delete name
详细property(getf=None, setf=None, delf=None, doc=None)参考python官网介绍
property 官网介绍

描述符:就是一个代表属性值的 对象

通过实现一个或多个特殊的get,set,delete()方法,可以将描述符与属性访问机制挂勾

class TypedProperty(object):
    def __init__(self, name ,type, default=None):
        self.name = '_' + name
        self.type = type
        self.default = default if default else type()
    def __get__(self, instance, cls):
        return getattr(instance, self.name, self.default)
    def __set__(self, instance, value):
        if not isinstance(value, self.type):
            raise TypeError("Must be a %s" % self.type)
        setattr(instance, self.name, value)
    def __delete__(self, instance):
        raise AttributeError("Can't delete attribute")
class foo():
    name = TypedProperty('num', int, 42)

测试结果如下:

f.name
42
f.name = 45
f.name = ‘ss’
Traceback (most recent call last):
File “”, line 1, in
File “/home/python_test/property_test.py”, line 38, in set
raise TypeError(“Must be a %s” % self.type)
TypeError: Must be a

猜你喜欢

转载自blog.csdn.net/xiaobai_classmate/article/details/79901060
今日推荐