python面向对象整理(三):对象的属性

这是javascript中对于对象的定义:

对象是无序属性的集合,其属性可以包含基本值,对象和函数。

所以,对于对象来说,最基本的东西就是属性,在python中,用dict来管理属性,obj.__dict__存储了对象的所有属性。

存取方法,就是用来读取或改变某个对象属性的方法。
在python中些特殊方法进行对象属性访问和行为控制,getattributegetattrsetattr、__delattr__等方法用来实现属性查找、缺失、设置、删除的一般逻辑。这些方法具有属性的”普适性”,可以用于属性查找、设置、删除的一般方法,也就是说所有的属性都可以使用这些方法实现属性的查找、设置、删除等操作。

描述符:
但是,这并不能很好地实现对某个具体属性的访问控制行为。例如,假如要实现dog.age属性的类型设置(只能是整数),如果单单去修改__setattr__方法满足它,那这个方法便有可能不能支持其他的属性设置。对特殊属性的控制行为就由描述符来控制。这里单独抽离出来一个属性对象,在属性对象中定义这个属性的查找、设置、删除行为。描述符类提供了去除存取方法中逻辑重复的机制,实现了代码重用。

描述符对象一般是作为其他类对象的属性而存在。在其内部定义了三个方法用来实现属性对象的查找、设置、删除行为。这三个方法分别是:

get(self, instance, owner):定义当试图取出描述符的值时的行为。
set(self, instance, value):定义当描述符的值改变时的行为。
delete(self, instance):定义当描述符的值被删除时的行为。
其中:instance为把描述符对象作为属性的对象实例;
owner为instance的类对象。

对对象属性的改变:
动态语言 dynamic programming language
是指在程序运行时,允许在运行时改变程序结构(例如引进新函数、删除旧函数)或变量类型的语言。
典型地,给一个类删除属性,增加属性。
从这个观点来看,Perl、Python、Ruby是动态语言,C++、Java、C#不是动态语言

顺便提一下动态类型语言 dynamically typed language,这和动态语言不一样。
在运行期检查变量类型的语言,也就是在编写代码的时候可以不指定变量的数据类型,例如Python、Ruby。动态类型语言中,变量没有类型,而值有类型
虽然给程序员带来了方便,但是检查变量会花费解释器极大的时间。
除此之外,使用JIT(即时编译)技术可以增加性能。

静态类型语言 statically typed language
变量的数据类型在编译期声明以后,不能再改变其数据类型,即变量在使用前必须先声明类型。检查在编译期进行,好处是编译期提前检查可能出现的错误,例如C++、Java

属性的运行时检查和修改:
内省和反射
内省,有时也叫类型内省,是在运行时进行的一种对象检测机制。我们可以在运行时通过内省来获取一个对象的所有信息,比如这个对象的类型,其中包含哪些属性等等。比如dir()和instance()等
相对于内省,反射更进一步,反射使得程序具有在运行时动态修改自己的结构和行为的能力(比如猴子补丁就是通过反射来实现)。程序不必在编译时期便确定此事,而是让程序得以在执行时期,根据一些外在的信息,决定操作的对象以及操作的方式,毋需于编译时期便确定、同时写死这些事情(减少了耦合)。
getattr,setattr等函数均属于反射函数。
getattr()方法。在Python中,当一个没有被定义的方法被访问时,getattr() 就会被调用。
反射最重要的用途就是开发各种通用框架(GUI等)。
多框架(比如 Spring)都是配置化的(比如通过 XML文件配置 JavaBean,Action之类的),为了保证框架的通用性,他们可能根据配置文件加载不同的对象或类,调用不同的方法,这个时候就必须用到反射——运行时动态加载需要加载的对象。

参考资料:
来源:http://python.jobbole.com/88582/
其他参考资料:Unifying types and classes in python2.2
Python中的“黑科技”:内省(Introspection)与反射(Reflection)
动态与弹性 细看编程语言的反射机制

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值