python 动态属性

Posted 蒋乐兴的技术随笔

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 动态属性的主要内容,如果未能解决你的问题,请参考以下文章

动态SQL基础概念复习(Javaweb作业5)

30 段 Python 实用代码

python在sqlite动态创建表源码

动态 Rstudio 代码片段

是否可以动态编译和执行 C# 代码片段?

即学即用的 30 段 Python 实用代码