python 动态属性
?
先來(lái)看一下一個(gè)常見的Python類的定義:
class Person(object):name = Noneage = Nonedef __init__(self,name,age):self.name = nameself.age = ageif __name__=="__main__":p = Person(name='jianglegege',age=16)print(p.name,p.age) # jianglegege 16?
來(lái)一個(gè)需求:
每一個(gè)person實(shí)例都要有一個(gè)sid屬性用來(lái)記錄社保號(hào)
?
寫法 1): 直接改Person類
class Person(object):name = Noneage = Nonesid = Nonedef __init__(self,name,age,sid):self.name = nameself.age = ageself.sid = sid?
寫法 2):創(chuàng)建完實(shí)例后單獨(dú)為實(shí)例設(shè)置sid屬性
class Person(object):name = Noneage = Nonedef __init__(self,name,age):self.name = nameself.age = ageif __name__=="__main__":p = Person(name='jianglegege',age=16)p.sid = '9527'print(p.name,p.age,p.sid)?
?
這兩種寫法各自的問(wèn)題:
1、對(duì)于第一種寫法如果再來(lái)一個(gè)需求你又要改動(dòng)Person類的定義、你這個(gè)類封閉不了。
?
2、對(duì)于第二種寫法要求在創(chuàng)建完成Person實(shí)例后都要記得為實(shí)例增加一個(gè)sid屬性、而它和第一種一樣在應(yīng)對(duì)新的需求
方面也同樣的不靈活
?
?
一種靈活的寫法:
class Person(object):name = Noneage = Nonedef __init__(self,*args,**kwargs):for k,v in kwargs.items():setattr(self,k,v)if __name__=="__main__":p = Person(name='jianglegege',age=16,sid='9527')print(p.name,p.age,p.sid)通過(guò)上面的寫法有兩個(gè)好處 1):Person類現(xiàn)在直接任意多屬性了、2):Person類也被封閉了 ;但是它也有一個(gè)不好的地方,比較有在創(chuàng)建p實(shí)例的時(shí)候沒有
傳遞sid這個(gè)值給構(gòu)造函數(shù),那么p實(shí)例就不會(huì)有這個(gè)屬性。
?
?
?
?
?
-----
轉(zhuǎn)載于:https://www.cnblogs.com/JiangLe/p/9071012.html
總結(jié)
以上是生活随笔為你收集整理的python 动态属性的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: DockPanel 类
- 下一篇: websocket python爬虫_p