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 = ''
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 动态属性的更多相关文章
- Python动态属性有什么用
Python 动态属性的概念可能会被面试问到,在项目当中也非常实用,但是在一般的编程教程中不会提到,可以进修一下. 先看一个简单的例子.创建一个 Student 类,我希望通过实例来获取每个学生的一些 ...
- Python动态属性和特性(一)
在Python中,数据的属性和处理数据的方法统称为属性.其实,方式只是可调用的属性.除了这二者之外,我们还可以创建特性(property),在不改变类接口的前提下,使用存取方法(即读取值和设置值方法) ...
- PythonI/O进阶学习笔记_7.python动态属性,__new__和__init__和元类编程(上)
content: 上: 1.property动态属性 2.__getattr__和__setattr__的区别和在属性查找中的作用 3.属性描述符 和属性查找过程 4.__new__和__init__ ...
- Python动态属性和特性(二)
内置的property经常用作装饰器,但它其实是一个类.在Python中,函数和类通常可以互换,因为二者都是可调用对象,而且没有实例化的new运算符,所以调用构造方法和调用工厂函数没有区别,只要能返回 ...
- Python进阶:@property 动态属性
Python进阶:@property 动态属性 Python 动态属性的概念可能会被面试问到,在项目当中也非常实用,但是在一般的编程教程中不会提到,可以进修一下. 先看一个简单的例子.创建一个 Stu ...
- Python属性描述符(二)
Python存取属性的方式特别不对等,通过实例读取属性时,通常返回的是实例中定义的属性,但如果实例未曾定义过该属性,就会获取类属性,而为实例的属性赋值时,通常会在实例中创建属性,而不会影响到类本身.这 ...
- Python属性描述符(一)
描述符是对多个属性运用相同存取逻辑的一种方式,,是实现了特性协议的类,这个协议包括了__get__.__set__和__delete__方法.property类实现了完整的描述符协议.通常,可以只实现 ...
- Python中的动态属性与描述符
动态属性与属性描述符 属性描述符是什么? 在解释属性查找顺序之前我们需要了解Python中的属性描述符,属性描述符作为其他类对象的属性而存在,实现了特殊方法中的get.set.delete中的一种 ...
- Python的高级特性5:谈谈python的动态属性
正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性. 看下面一种常见的get/set操作 In [174]: class ...
随机推荐
- (转)C#中Invoke的用法 一
在用.NET Framework框架的WinForm构建GUI程序界面时,如果要在控件的事件响应函数中改变控件的状态,例如:某个按钮上的文本原先叫“打开”,单击之后按钮上的文本显示“关闭”,初学者往往 ...
- bash shell 获取当前正在执行脚本的绝对路径
https://my.oschina.net/leejun2005/blog/150662 http://blog.csdn.net/10km/article/details/51906821 如题, ...
- insert-interval 插入区间
Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessa ...
- 〖Linux〗简单的将Shell和一些文件打包成一个单独的“可执行文件”
有时候给别人分享一个工具的时候,同时需要提供的文件比较多: 如果分享一个压缩包还得教会对方如何解压.执行哪个脚本,感觉需要传输的内容多了就不方便: 把几个Shell脚本和文件打包成一个“单独的可执行文 ...
- JavaSE入门学习7:Java基础语法之语句(下)
继续接着Java基础语法来:JavaSE入门学习5:Java基础语法(一)和JavaSE入门学习6:Java基础语法(二). 语句 Java经常使用的3种循环:while.do...while,for ...
- java中pojo、dao命名解释
POJO::POJO(Plain Ordinary Java Object)简单的Java对象,实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称. 使用POJO名称是为了避免和EJB ...
- android自动化测试--appium运行的坑问题及解决方法
问题 1. error: Failed to start an Appium session, err was: Error: Requested a new session but one was ...
- Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener. ...nested exception is java.lang.NoSuchMethodError:
ssh 中,项目部署到服务器的时候,出现这样的奇葩的事情: 21-Oct-2017 11:27:15.953 INFO [localhost-startStop-1] org.apache.catal ...
- 下载完整版Chrome离线安装文件的官方地址
只在自己账号下安装Download Google Chrome Standalone Offline Installer (32-bit) http://www.google.com/chrome/ ...
- Mac OS X上安装配置apache服务器
说明:Mac在安装完成Mac系统的时候它已经自带了apache服务器,接下来就是配置和将它启动运行了.那么接下来要做的事情就是: 1.配置apache的配置文件 2.设置虚拟主机 启动并查看apach ...