zoukankan      html  css  js  c++  java
  • 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实例就不会有这个属性。

    -----

  • 相关阅读:
    微软职位内部推荐-Software Engineer II
    微软职位内部推荐-Senior Software Engineer
    Linux日期时间显示输出
    Redis性能优化
    Can't use Subversion command line client: svn
    redis常用性能分析命令
    Linux下配置tomcat + apr + native应对高并发
    Tomcat7并发和线程数
    mongodb常用命令小结
    Spring MVC @PathVariable被截断
  • 原文地址:https://www.cnblogs.com/JiangLe/p/9071012.html
Copyright © 2011-2022 走看看