Python 中@property的用法
本文内容纲要:
在绑定属性时,如果我们直接把属性赋值给对象,比如:
p=Person()
p.name='Mary'
我们先看个详细的例子(注意双下划线name和age定义为私有变量):
classPerson(object):
def__init__(self,name,age):
self.__name=name
self.__age=age
defget_age_fun(self):
returnself.__age
defset_age_fun(self,value):
ifnotisinstance(value,int):
raiseValueError('年龄必须是数字!')
ifvalue<0orvalue>100:
raiseValueError('年龄必须是0-100')
self.__age=value
defprint_info(self):
print('%s:%s'%(self.__name,self.__age))
p=Person('balala',20)
p.__age=17
print(p.__age)#17
print(p.get_age_fun())#20表面上看,上面代码“成功”地设置了__age变量17,但实际上这个__age变量和class内部的__age变量不是一个变量!
#内部的__age变量已经被Python解释器自动改成了_Person_age,而外部代码给p新增了一个__age变量。所以调用get_age_fun输出的是初始值
p.set_age_fun(35)
print(p.get_age_fun())#35
print(p.print_info())#balala:35
输出:
17
20
35
balala:35
表面上看,外部代码“成功”地设置了__age变量17,但实际上这个_age变量和class内部的_age变量不是一个变量!
内部的_age变量已经被Python解释器自动改成了_Person_age,而外部代码给p新增了一个_age变量。所以调用get_age_fun输出的是初始值20
而set_age_fun通过class内部改变了age变量值,所以最终输出balala:35
我们再稍微调整下:
(注意只改变了一个变量名:原来的私有属性__age单下划线为:_age,也可以定义为:age.
解释:以一个下划线开头的实例变量名,比如_age,这样的实例变量外部是可以访问的,但是,按照约定俗成的规定,当看到这样的变量时,意思是,"虽然可以被访问,但是,请视为私有变量,不要随意访问。")
classPerson(object):
def__init__(self,name,age):
self.__name=name
self._age=age
defget_age_fun(self):
returnself._age
defset_age_fun(self,value):
ifnotisinstance(value,int):
raiseValueError('年龄必须是数字!')
ifvalue<0orvalue>100:
raiseValueError('年龄必须是0-100')
self._age=value
defprint_info(self):
print('%s:%s'%(self.__name,self._age))
p=Person('balala',20)
p._age=17
print(p._age)#17
print(p.get_age_fun())#这里是17不再是20,因为此时_age是全局变量,外部直接影响到类内部的更新值
p.set_age_fun(35)
print(p.get_age_fun())#35
print(p.print_info())#balala:35
输出:
117
217
335
4balala:35
看的出私有和全局的设置
但是,上面的调用方法是不是略显复杂,没有直接用属性这么直接简单。
有没有可以用类似属性这样简单的方式来访问类的变量呢?必须的,对于类的方法
我们先来看一个稍微改造的例子:(稍后我们再使用Python内置的@property
装饰器就是负责把一个方法变成属性调用.)
我们进入正题:看看@property的妙用之处:
1classPerson(object):
2def__init__(self,name,age):
3self.__name=name
4self.__age=age
5
6@property
7defget_age_fun(self):
8returnself.__age
9
10@get_age_fun.setter#get_age_fun是上面声明的方法
11defset_age_fun(self,value):
12ifnotisinstance(value,int):
13raiseValueError('年龄必须是数字!')
14ifvalue<0orvalue>100:
15raiseValueError('年龄必须是0-100')
16self.__age=value
17
18defprint_info(self):
19print('%s:%s'%(self.__name,self.__age))
20
21
22p=Person('balala',20)
23p.__age=17
24print(p.__age)#17
25print(p.get_age_fun)#20注意这里不带()
26
27#p.set_age_fun(35)注意不能这样调用赋值了
28p.set_age_fun=35#这里set_age_fun就是声明的函数不带()
29print(p.get_age_fun)#35
30print(p.print_info())#balala:35
输出:
17
20
35
balala:35
本文内容总结:
原文链接:https://www.cnblogs.com/phpper/p/10618775.html