(转)Python内置函数进阶之“属性(property())”详解

原文:https://blog.csdn.net/GeekLeee/article/details/78519767

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/GeekLeee/article/details/78519767
属性函数(property)有以下作用:
- 将类方法转换为只读属性
- 重新实现一个属性的setter和getter方法

将类方法转换为只读属性
class Person(object):
""""""

#----------------------------------------------------------------------
def __init__(self, first_name, last_name):
"""Constructor"""
self.first_name = first_name
self.last_name = last_name

#----------------------------------------------------------------------
@property
def full_name(self):
"""
Return the full name
"""
return "%s %s" % (self.first_name, self.last_name)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
以上创建了
两个类属性:self.first_name和self.last_name
一个full_name方法
调用full_name方法为person.full_name(),用@property变为person.full_name


>>> person = Person("Mike", "Driscoll")
>>> person.full_name
'Mike Driscoll'
>>> person.first_name
'Mike'
>>> person.full_name = "Jackalope"
Traceback (most recent call last):
File "<string>", line 1, in <fragment>
AttributeError: can't set attribute
1
2
3
4
5
6
7
8
9
10
但他只具有只读属性,不能更改
Python进阶之“属性(property)”详解
Python 中的 property 属性

两个等同的代码:

class Foo:
def __init__(self,val):
self.__NAME=val #将所有的数据属性都隐藏起来

@property #get
def name(self):
return self.__NAME #obj.name访问的是self.__NAME(这也是真实值的存放位置)

@name.setter #set
def name(self,value):
if not isinstance(value,str): #在设定值之前进行类型检查
raise TypeError('%s must be str' %value)
self.__NAME=value #通过类型检查后,将值value存放到真实的位置self.__NAME

@name.deleter #delete
def name(self):
raise TypeError('Can not delete')

f=Foo('egon')
print(f.name)
# f.name=10 #抛出异常'TypeError: 10 must be str'
del f.name #抛出异常'TypeError: Can not delete'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Foo:
def __init__(self,val):
self.__NAME=val #将所有的数据属性都隐藏起来

def getname(self): #get
return self.__NAME #obj.name访问的是self.__NAME(这也是真实值的存放位置)

def setname(self,value): #set
if not isinstance(value,str): #在设定值之前进行类型检查
raise TypeError('%s must be str' %value)
self.__NAME=value #通过类型检查后,将值value存放到真实的位置self.__NAME

def delname(self): #delete
raise TypeError('Can not delete')

name=property(getname,setname,delname) #最后把方法变成属性

#一种property的古老用法
---------------------
作者:GeekLeee
来源:CSDN
原文:https://blog.csdn.net/GeekLeee/article/details/78519767
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自www.cnblogs.com/liujiacai/p/10042907.html