版权声明:本文为博主原创文章,未经博主允许不得转载。 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