python 动态属性
先来看一下一个常见的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实例就不会有这个属性。
-----