python使用@property @x

发布时间:2019-09-07 08:00:00编辑:auto阅读(1622)

    @property可以将python定义的函数“当做”属性访问,从而提供更加友好访问方式,但是有时候setter/deleter也是需要的。
    1》只有@property表示只读
    2》同时有@property和@x.setter表示可读可写

    3》同时有@property和@x.setter和@x.deleter表示可读可写可删除

    class student(object):  #新式类
        def __init__(self,id):  
            self.__id=id  
        @property  #读  
        def score(self):  
            return self._score  
        @score.setter #写  
        def score(self,value):  
            if not isinstance(value,int):  
                raise ValueError('score must be an integer!')    
            if value<0 or value>100:  
                raise ValueError('score must between 0 and 100')   
            self._score=value  
        @property #读(只能读,不能写)  
        def get_id(self):  
            return self.__id  
      
    s=student('123456')  
    s.score=60 #写  
    print s.score #读  
    #s.score=-2 #ValueError: score must between 0 and 100  
    #s.score=32.6 #ValueError: score must be an integer!  
    s.score=100 #写  
    print s.score #读  
    print s.get_id #读(只能读,不可写)
    #s.get_id=456 #只能读,不可写:AttributeError: can't set attribute

    运行结果:
    60
    100
    123456

    class A(object):#新式类(继承自object类)
        def __init__(self):
            self.__name=None
        def getName(self):
            return self.__name
        def setName(self,value):
            self.__name=value
        def delName(self):
            del self.__name
        name=property(getName,setName,delName)
    
    a=A()
    print a.name #读
    a.name='python' #写
    print a.name #读
    del a.name #删除
    #print a.name #a.name已经被删除 AttributeError: 'A' object has no attribute '_A__name'
    运行结果:
    None
    python

    class A(object):#要求继承object
        def __init__(self):
            self.__name=None
        
        #下面开始定义属性,3个函数的名字要一样!
        @property #读
        def name(self):
            return self.__name
        @name.setter #写
        def name(self,value):
            self.__name=value
        @name.deleter #删除
        def name(self):
            del self.__name
        
    a=A()
    print a.name #读
    a.name='python'  #写
    print a.name #读
    del a.name #删除
    #print a.name # a.name已经被删除 AttributeError: 'A' object has no attribute '_A__name'  
    运行结果:
    None
    python

    class person(object):
        def __init__(self,first_name,last_name):
            self.first_name=first_name
            self.last_name=last_name
        @property #读
        def full_name(self):
            return '%s %s' % (self.first_name,self.last_name) 
    
    p=person('wu','song')
    print p.full_name #读
    #p.full_name='song ming' #只读,不可修改  AttributeError: can't set attribute  
    p.first_name='zhang'
    print p.full_name #读
    运行结果:
    wu song
    zhang song
    上面都是以新式类为例子,下面我们看一个包含经典类的例子:

    #!/usr/bin/env python
    #coding:utf-8
    
    class test1:#经典类:没有继承object    
        def __init__(self):    
            self.__private='alex 1' #私有属性以2个下划线开头    
        #读私有属性    
        @property    
        def private(self):    
            return self.__private    
        #尝试去写私有属性(对于经典类而言,“写”是做不到的,注意看后边的代码和注释!)  
        @private.setter    
        def private(self,value):    
            self.__private=value   
        #尝试去删除私有属性(对于经典类而言,“删除”也是做不到的,具体看后边的代码和注释!)  
        @private.deleter  
        def private(self):  
            del self.__private  
          
    class test2(object):#新式类:继承了object    
        def __init__(self):    
            self.__private='alex 2' #私有属性以2个下划线开头    
        #读私有属性    
        @property    
        def private(self):    
            return self.__private    
        #写私有属性    
        @private.setter    
        def private(self,value):    
            self.__private=value  
        #删除私有属性  
        @private.deleter  
        def private(self):  
            del self.__private  
          
    t1=test1()    
    #print t1.__private #外界不可直接访问私有属性    
    print t1.private #读私有属性
    print t1.__dict__   
    t1.private='change 1' #对于经典类来说,该语句实际上是为实例t1添加了一个实例变量private  
    print t1.__dict__  
    print t1.private #输出刚刚添加的实例变量private  
    t1.private='change 2'  
    print t1.__dict__  
    del t1.private #删除刚刚添加的实例变量private  
    print t1.__dict__  
    print t1.private #读私有属性
    #del t1.private #无法通过这种方式删除私有属性:AttributeError: test1 instance has no attribute 'private'
    #对于经典类而言,我们无法通过上面的语句,对实例的私有变量__private进行修改或删除!  
    print '-------------------------------------------------------'    
    t2=test2()    
    print t2.__dict__  
    print t2.private #继承了object,添加@private.setter后,才可以写    
    t2.private='change 2' #修改私有属性    
    print t2.__dict__   
    print t2.private  
    del t2.private #删除私有变量  
    #print t2.private #私有变量已经被删除,执行“读”操作会报错:AttributeError: 'test2' object has no attribute '_test2__private'    
    print t2.__dict__  
    #对于新式类而言,我们可以通过上面的语句,对实例的私有变量__private进行修改或删除  
    运行结果:

    alex 1
    {'_test1__private': 'alex 1'}
    {'_test1__private': 'alex 1', 'private': 'change 1'}
    change 1
    {'_test1__private': 'alex 1', 'private': 'change 2'}
    {'_test1__private': 'alex 1'}
    alex 1
    -------------------------------------------------------
    {'_test2__private': 'alex 2'}
    alex 2
    {'_test2__private': 'change 2'}
    change 2
    {}

    (完)



关键字