Python属性和内建属性实例解析
这篇文章主要介绍了Python属性和内建属性实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
1.私有属性添加getter和setter方法
classMoney(object): def__init__(self): self.__money=0 defgetMoney(self): returnself.__money defsetMoney(self,value): ifisinstance(value,int): self.__money=value else: print("error:不是整型数字")
2.使用property升级getter和setter方法
classMoney(object): def__init__(self): self.__money=0 defgetMoney(self): returnself.__money defsetMoney(self,value): ifisinstance(value,int): self.__money=value else: print("error:不是整型数字") money=property(getMoney,setMoney)
运行结果:
In[1]:fromget_setimportMoney In[2]: In[2]:a=Money() In[3]: In[3]:a.money Out[3]:0 In[4]:a.money=100 In[5]:a.money Out[5]:100 In[6]:a.getMoney() Out[6]:100
3.使用property取代getter和setter方法
@property成为属性函数,可以对属性赋值时做必要的检查,并保证代码的清晰短小,主要有2个作用
将方法转换为只读
重新实现一个属性的设置和读取方法,可做边界判定
classMoney(object): def__init__(self): self.__money=0 @property defmoney(self): returnself.__money @money.setter defmoney(self,value): ifisinstance(value,int): self.__money=value else: print("error:不是整型数字")
运行结果
In[3]:a=Money() In[4]: In[4]: In[4]:a.money Out[4]:0 In[5]:a.money=100 In[6]:a.money Out[6]:100
内建属性
"teachclass.py" classPerson(object): pass
python3.5中类的内建属性和方法
经典类(旧式类),早期如果没有要继承的父类,继承里空着不写的类
#py2中无继承父类,称之经典类,py3中已默认继承object classPerson: pass
子类没有实现__init__方法时,默认自动调用父类的。如定义__init__方法时,需自己手动调用父类的__init__方法
__getattribute__例子:
classItcast(object): def__init__(self,subject1): self.subject1=subject1 self.subject2='cpp' #属性访问时拦截器,打log def__getattribute__(self,obj): ifobj=='subject1': print('logsubject1') return'redirectpython' else:#测试时注释掉这2行,将找不到subject2 returnobject.__getattribute__(self,obj) defshow(self): print('thisisItcast') s=Itcast("python") print(s.subject1) print(s.subject2)
运行结果:
logsubject1 redirectpython cpp
**__getattribute__的坑**
classPerson(object): def__getattribute__(self,obj): print("---test---") ifobj.startswith("a"): return"hahha" else: returnself.test deftest(self): print("heihei") t.Person() t.a#返回hahha t.b#会让程序死掉 #原因是:当t.b执行时,会调用Person类中定义的__getattribute__方法,但是在这个方法的执行过程中 #if条件不满足,所以程序执行else里面的代码,即returnself.test问题就在这,因为return需要把 #self.test的值返回,那么首先要获取self.test的值,因为self此时就是t这个对象,所以self.test就是 #t.test此时要获取t这个对象的test属性,那么就会跳转到__getattribute__方法去执行,即此时产 #生了递归调用,由于这个递归过程中没有判断什么时候推出,所以这个程序会永无休止的运行下去,又因为 #每次调用函数,就需要保存一些数据,那么随着调用的次数越来越多,最终内存吃光,所以程序崩溃 # #注意:以后不要在__getattribute__方法中调用self.xxxx
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。