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实例就不会有这个属性。

 

 

 

 

 

-----

posted on 2018-05-22 11:08  蒋乐兴的技术随笔  阅读(309)  评论(1编辑  收藏  举报

导航