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

    -----

  • 相关阅读:
    git
    RT-Thread 4.0 + STM32F407 学习笔记1
    C#串口通信及数据表格存储
    NRF52832初步使用
    ubuntu终端下快捷键之--字体放大缩小
    微信公众号开发被动回复用户消息,回复内容Content使用了" "换行符还是没有换行
    python2018年秋季调研
    python图像处理模块Pillow--Image模块
    linux查看文件命令tail的使用
    使用xadmin更新数据时,报错expected string or bytes-like object
  • 原文地址:https://www.cnblogs.com/JiangLe/p/9071012.html
Copyright © 2011-2022 走看看