property详解
下面我们来看一段java代码:
class Person{ private name;//把name设为私有属性 private age;//把age设为私有属性 public String getName(){ return name } public setName(String name){ this.name=name } public int getAge(){ return age } public setAge(int age){ this.age=age } }
我们只能通过相应公有的get、set方法去访问、设置属性值
在python中,我们同样可以对属性进行私有化,但是,我们也希望通过提供一个公有的方法去访问、设置属性值
class Person: def __init__(self,name,age): self.__name=name#把name属性设为私有 self.__age=age#把age属性设为私有 p=Person("厨房不败",100) print(p.__name)
print(p.__age)
执行结果如下:
Traceback (most recent call last):
File "F:/python/stuDemo/002.py", line 7, in <module>
print(p.__name)
AttributeError: 'Person' object has no attribute '__name'
属性私有化无法访问,所以报错
那我们能不能像java一样提供一个公共的方法来访问、设置属性呢?答案当然是肯定的。
class Person:
def __init__(self,name,age):
self.__name=name#把name属性设为私有
self.__age=age#把age属性设为私有
def getname(self):
return self.__name
def setname(self,name):
self.__name=name
def getage(self):
return self.__age
def setage(self,age):
self.__age=age
p=Person("厨房不败",100)
print(p.getname())
p.setname("灰太狼")
print(p.getname())
print(p.getage())
p.setage(18)
print(p.getage())
执行结果为:
厨房不败
灰太狼
100
18
通过上面的方式,我们已经实现了和java一样的功能,但是在python中,我们提供了更便捷的方式,就是通过@property装饰器的方式,那么它方便在哪里呢,我们一起来看下面代码。
class Person:
def __init__(self,name,age):
self.__name=name#把name属性设为私有
self.__age=age#把age属性设为私有
@property
def name(self):
return self.__name
@name.setter
def name(self,name):
self.__name=name
@property
def age(self):
return self.__age
@age.setter
def age(self,age):
self.__age=age
p=Person("厨房不败",100)
print(p.name)
p.name="灰太狼"
print(p.name)
print(p.age)
p.age=18
print(p.age)
执行结果为:
厨房不败
灰太狼
100
18
通过观察我们发现,效果与上面一毛一样,有木有?
下面,我们就来了解一下下@property。
@property会将类方法变为只读属性,也就是相当于java中的get方法。
这样一来,我们就可以调用数据属性一样去调用函数属性。
对于上面的代码,我们还可以通过property函数去实现
class Person:
def __init__(self,name,age):
self.__name=name#把name属性设为私有
self.__age=age#把age属性设为私有
def getname(self):
return self.__name
def setname(self,name):
self.__name=name
def getage(self):
return self.__age
def setage(self,age):
self.__age=age
name=property(getname,setname,"这是name属性的访问和设置")
age=property(getage,setage,"这是age属性的访问和设置")
p=Person("厨房不败",100)
print(p.name)
p.name="灰太狼"
print(p.name)
print(p.age)
p.age=18
print(p.age)
执行结果为:
厨房不败
灰太狼
100
18
p.name 会触发getter
p.name=value 会触发setter
在我身后,微笑地活下去吧。