zoukankan      html  css  js  c++  java
  • 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


    在我身后,微笑地活下去吧。
  • 相关阅读:
    c++------引用(左值与右值,引用一个数组,const限制)
    c++------智能指针,tuple多元数组
    c++中const和c中const区别
    c++新特性-------函数包装器,模板元加速
    c++新特性---lambda表达式
    c++新特性-收缩转换,二进制,constexpr,以及namespace&&inline
    Eureka 注册中心 和 Config中心 配置
    最近的日子-2019/8/12
    工作上的态度
    保持运动 对心情很重要
  • 原文地址:https://www.cnblogs.com/L-C98/p/9123774.html
Copyright © 2011-2022 走看看