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


 

posted @ 2018-06-01 22:16  南邪  阅读(1839)  评论(0编辑  收藏  举报