文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

python使用@property @x

2023-01-31 05:35

关注
@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
{}

(完)



阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯