python 動態屬性
阿新 • • 發佈:2018-05-22
定義 print 傳遞 set class col id屬性 兩種 動態
先來看一下一個常見的Python類的定義:
class Person(object): name = None age = None def __init__(self,name,age): self.name = name self.age = age if __name__=="__main__": p = Person(name=‘jianglegege‘,age=16) print(p.name,p.age) # jianglegege 16
來一個需求:
每一個person實例都要有一個sid屬性用來記錄社保號
寫法 1): 直接改Person類
class Person(object): name = None age = None sid = None def __init__(self,name,age,sid): self.name = name self.age = age self.sid = sid
寫法 2):創建完實例後單獨為實例設置sid屬性
class Person(object): name = None age = None def __init__(self,name,age): self.name = name self.age = age if __name__=="__main__": p = Person(name=‘jianglegege‘,age=16) p.sid = ‘9527‘ print(p.name,p.age,p.sid)
這兩種寫法各自的問題:
1、對於第一種寫法如果再來一個需求你又要改動Person類的定義、你這個類封閉不了。
2、對於第二種寫法要求在創建完成Person實例後都要記得為實例增加一個sid屬性、而它和第一種一樣在應對新的需求
方面也同樣的不靈活
一種靈活的寫法:
class Person(object): name = None age = None def __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)
通過上面的寫法有兩個好處 1):Person類現在直接任意多屬性了、2):Person類也被封閉了 ;但是它也有一個不好的地方,比較有在創建p實例的時候沒有
傳遞sid這個值給構造函數,那麽p實例就不會有這個屬性。
-----
python 動態屬性