码迷,mamicode.com
首页 > 编程语言 > 详细

python 动态属性

时间:2018-05-22 12:40:20      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:社保   属性   __init__   --   set   color   *args   war   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实例就不会有这个属性。

 

 

 

 

 

-----

python 动态属性

标签:社保   属性   __init__   --   set   color   *args   war   python类   

原文地址:https://www.cnblogs.com/JiangLe/p/9071012.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!