Python属性和内建属性
生活随笔
收集整理的這篇文章主要介紹了
Python属性和内建属性
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
屬性property
1. 私有屬性添加getter和setter方法
class Money(object):def __init__(self):self.__money = 0def getMoney(self):return self.__moneydef setMoney(self, value):if isinstance(value, int):self.__money = valueelse:print("error:不是整型數(shù)字")2. 使用property升級(jí)getter和setter方法
''' 遇到問(wèn)題沒人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流QQ群:579817333 尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和PDF電子書! ''' class Money(object):def __init__(self):self.__money = 0def getMoney(self):return self.__moneydef setMoney(self, value):if isinstance(value, int):self.__money = valueelse:print("error:不是整型數(shù)字")money = property(getMoney, setMoney)運(yùn)行結(jié)果:
In [1]: from get_set import MoneyIn [2]: In [2]: a = Money()In [3]: In [3]: a.money Out[3]: 0In [4]: a.money = 100In [5]: a.money Out[5]: 100In [6]: a.getMoney() Out[6]: 1003. 使用property取代getter和setter方法
@property成為屬性函數(shù),可以對(duì)屬性賦值時(shí)做必要的檢查,并保證代碼的清晰短小,主要有2個(gè)作用
將方法轉(zhuǎn)換為只讀
重新實(shí)現(xiàn)一個(gè)屬性的設(shè)置和讀取方法,可做邊界判定
運(yùn)行結(jié)果
In [3]: a = Money()In [4]: In [4]: In [4]: a.money Out[4]: 0In [5]: a.money = 100In [6]: a.money Out[6]: 100內(nèi)建屬性
"teachclass.py"class Person(object):passpython3.5中類的內(nèi)建屬性和方法
經(jīng)典類(舊式類),早期如果沒有要繼承的父類,繼承里空著不寫的類
子類沒有實(shí)現(xiàn)__init__方法時(shí),默認(rèn)自動(dòng)調(diào)用父類的。 如定義__init__方法時(shí),需自己手動(dòng)調(diào)用父類的__init__方法
__getattribute__例子:
''' 遇到問(wèn)題沒人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流QQ群:579817333 尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和PDF電子書! ''' class Itcast(object):def __init__(self,subject1):self.subject1 = subject1self.subject2 = 'cpp'#屬性訪問(wèn)時(shí)攔截器,打logdef __getattribute__(self,obj):if obj == 'subject1':print('log subject1')return 'redirect python'else: #測(cè)試時(shí)注釋掉這2行,將找不到subject2return object.__getattribute__(self,obj)def show(self):print('this is Itcast')s = Itcast("python") print(s.subject1) print(s.subject2)運(yùn)行結(jié)果:
log subject1 redirect python cpp__getattribute__的坑
''' 遇到問(wèn)題沒人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流QQ群:579817333 尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和PDF電子書! ''' class Person(object):def __getattribute__(self,obj):print("---test---")if obj.startswith("a"):return "hahha"else:return self.testdef test(self):print("heihei")t.Person()t.a #返回hahhat.b #會(huì)讓程序死掉#原因是:當(dāng)t.b執(zhí)行時(shí),會(huì)調(diào)用Person類中定義的__getattribute__方法,但是在這個(gè)方法的執(zhí)行過(guò)程中#if條件不滿足,所以 程序執(zhí)行else里面的代碼,即return self.test 問(wèn)題就在這,因?yàn)閞eturn 需要把#self.test的值返回,那么首先要獲取self.test的值,因?yàn)閟elf此時(shí)就是t這個(gè)對(duì)象,所以self.test就是#t.test 此時(shí)要獲取t這個(gè)對(duì)象的test屬性,那么就會(huì)跳轉(zhuǎn)到__getattribute__方法去執(zhí)行,即此時(shí)產(chǎn)#生了遞歸調(diào)用,由于這個(gè)遞歸過(guò)程中 沒有判斷什么時(shí)候推出,所以這個(gè)程序會(huì)永無(wú)休止的運(yùn)行下去,又因?yàn)?/span>#每次調(diào)用函數(shù),就需要保存一些數(shù)據(jù),那么隨著調(diào)用的次數(shù)越來(lái)越多,最終內(nèi)存吃光,所以程序 崩潰## 注意:以后不要在__getattribute__方法中調(diào)用self.xxxx總結(jié)
以上是生活随笔為你收集整理的Python属性和内建属性的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python作用域与LEGB规则
- 下一篇: websocket python爬虫_p