• 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爬虫学习之MongoDB学习笔记
    python基础学习笔记
    基于python的turtle模块画国旗
    基于tkinter的gui编程基础学习笔记
    python爬虫实现各视频网站vip付费电影下载
    网页模板收藏
    python爬虫实战项目
    python爬取詹姆斯职业生涯数据并生成图标展示
    爬虫框架scrapy学习笔记
    基于python的OpenCV图像处理学习笔记
  • 原文地址:https://www.cnblogs.com/JiangLe/p/9071012.html
Copyright © 2020-2023  润新知