先来看一下一个常见的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 = ''
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='')
print(p.name,p.age,p.sid)

通过上面的写法有两个好处 1):Person类现在直接任意多属性了、2):Person类也被封闭了 ;但是它也有一个不好的地方,比较有在创建p实例的时候没有

传递sid这个值给构造函数,那么p实例就不会有这个属性。

-----

python 动态属性的更多相关文章

  1. Python动态属性有什么用

    Python 动态属性的概念可能会被面试问到,在项目当中也非常实用,但是在一般的编程教程中不会提到,可以进修一下. 先看一个简单的例子.创建一个 Student 类,我希望通过实例来获取每个学生的一些 ...

  2. Python动态属性和特性(一)

    在Python中,数据的属性和处理数据的方法统称为属性.其实,方式只是可调用的属性.除了这二者之外,我们还可以创建特性(property),在不改变类接口的前提下,使用存取方法(即读取值和设置值方法) ...

  3. PythonI/O进阶学习笔记_7.python动态属性,__new__和__init__和元类编程(上)

    content: 上: 1.property动态属性 2.__getattr__和__setattr__的区别和在属性查找中的作用 3.属性描述符 和属性查找过程 4.__new__和__init__ ...

  4. Python动态属性和特性(二)

    内置的property经常用作装饰器,但它其实是一个类.在Python中,函数和类通常可以互换,因为二者都是可调用对象,而且没有实例化的new运算符,所以调用构造方法和调用工厂函数没有区别,只要能返回 ...

  5. Python进阶:@property 动态属性

    Python进阶:@property 动态属性 Python 动态属性的概念可能会被面试问到,在项目当中也非常实用,但是在一般的编程教程中不会提到,可以进修一下. 先看一个简单的例子.创建一个 Stu ...

  6. Python属性描述符(二)

    Python存取属性的方式特别不对等,通过实例读取属性时,通常返回的是实例中定义的属性,但如果实例未曾定义过该属性,就会获取类属性,而为实例的属性赋值时,通常会在实例中创建属性,而不会影响到类本身.这 ...

  7. Python属性描述符(一)

    描述符是对多个属性运用相同存取逻辑的一种方式,,是实现了特性协议的类,这个协议包括了__get__.__set__和__delete__方法.property类实现了完整的描述符协议.通常,可以只实现 ...

  8. Python中的动态属性与描述符

    动态属性与属性描述符 属性描述符是什么?   在解释属性查找顺序之前我们需要了解Python中的属性描述符,属性描述符作为其他类对象的属性而存在,实现了特殊方法中的get.set.delete中的一种 ...

  9. Python的高级特性5:谈谈python的动态属性

    正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性. 看下面一种常见的get/set操作 In [174]: class ...

随机推荐

  1. C语言之函数调用06—彩球排列

    //函数调用+递归法 /* ========================================================== 题目:将4个红球,3个白球.3个黄球排成一排,共同拥有 ...

  2. TortoiseGit使用指南

    http://www.360doc.com/content/13/0424/17/9171956_280649187.shtml

  3. k-means算法MATLAB和opencv代码

    上一篇博客写了k-means聚类算法和改进的k-means算法.这篇博客就贴出相应的MATLAB和C++代码. 下面是MATLAB代码,实现用k-means进行切割: %%%%%%%%%%%%%%%% ...

  4. Maven的坐标与资源库

    在Maven世界中,每个工程都有它唯一的 组织名.模块名.版本 ,这三个就是maven项目的坐标,一个maven工程可以打包成jar.war.pom等形式,但是它们都是拥有上述三个坐标的.我们在项目过 ...

  5. 解决ODI 12C Studio 运行缓慢问题

    一.配置 ODI 12C Studio 1.1 修改ODI Studio process的-Xms和-Xmx ide.conf: modifying the initial Heap size (-X ...

  6. 〖Windows〗三星(SAMSUNG)905S3G-K07 安装Windows 7 过程分享

    在京东买了一台笔记本(SAMSUNG 905S3G-K07)给女朋友,发现Win8还是使用得不太顺手: 于是决定把这个Win8操作系统切换到Win7,也开始了一段虐心的过程: 一.制作U盘启动 1. ...

  7. springMVC自定义方法属性解析器

    使用场景例子: 用户登陆系统一般会往Session里放置一个VO对象,然后在controller里会来获取用户的userId等信息. 之前的写法是:@SessionAttributes配合@Model ...

  8. 开启spring boot actuator 安全认证

    通过本文配置,会对actuator 除了health外的所有端点,开启用户名密码验证,对于自己开发的接口不会要求用户名密码验证. 版本: <parent> <groupId>o ...

  9. Spark ML 几种 归一化(规范化)方法总结

    规范化,有关之前都是用 python写的,  偶然要用scala 进行写, 看到这位大神写的, 那个网页也不错,那个连接图做的还蛮不错的,那天也将自己的博客弄一下那个插件. 本文来源 原文地址:htt ...

  10. API返回错误信息的最佳实践

    使用HTTP Status区分不同消息返回 最基础的三个状态200 OK, 400 Client Error, 500 Server Error 这些应该是够的, 如果客户端可以处理更细的划分, 可以 ...