Python中一切皆对象,所以模块、类、类方法、函数,以及数据类型等都是对象。
以内置数据类型list为例,它拥有明确的方法名称,比如index、append等。在面向对象的编程中,我们有这样的需求。假如animal是父类,cat、dog都是它的子类;我们经常会写一个封装类来负责实例化这些类。在C++中我能想到的办法是父类的一个字段用于判断类的具体类型,然后一个大的if结构进行类的实例化。假如现在又添加了一个bird类,C++该怎么办?
调整if结构,增加一项判断bird类的分支。
Python的从多强大功能之一:自省。 利用它,封装类可不用修改。我们前面提到,list拥有index、append等方法。我们使用它的方式一般是,l.append(1)的形式,而python支持将append“
变量化”。什么?x=“append”, l.x(1) 这样吗? 当然不是,万一l也有x方法怎么办? python借助的是三个重要的内置函数,hasattr、setattr、getattr。
hasattr(object, name) -> bool ==》 Return whether the object has an attribute with the given name。name是字符串的形式。
getattr(object, name[, default]) -> value ==》 Get a named attribute from an object
setattr(object, name, value) ==》 Set a named attribute on an object; setattr(x, 'y', v) is equivalent to ``x.y = v''.
l.append(1) <==> getattr(, "append")()
同理,python中封装类调用getattr(object, method),而object和method都以形参形式暴露出来。生成一个bird类的实例时,只要传递给method的字符串是“bird”即可。
即,封装类在事先不清楚有什么样的对象(类、类方法、数据类型等)时,采用自省的方法。
问题:如果传递了bird而我们如果没有实现相应的类呢?python会产生异常。
说白了,以上就是介绍了三个内置函数,hasattr、getattr、setattr。Python还有很多有用的内置函数。
type函数
type ==》 type函数返回任何对象的数据类型。你可以使用types模块中的常量来进行对象类型的比较。
>>> type(dir)
//我想说的是,函数对象也有数据类型。
>>>type(list) == types.TypeType
>>>type(os) == types.ModuleType
str函数
每种数据类型都可以强制转换为字符串。而所有的对象都是某种数据类型,即所有的对象都能转换为字符串。貌似跟__repr__属性有关,只要是实现了__repr__方法的数据类型,str(object)就可以执行。
callable函数
以上是以类方法为例子,解释python的自省功能。实际上,自省功能可应用到所有的对象上。
《深入理解Python》还介绍了一个相关的模块,inspect模块。
可调用类型的对象:《深入理解Python》中解释是在对象后面加上括号+参数,就能形成一条语句的对象。所以函数,数据类型、类方法等都是可调用类型的对象。以下内置函数可查看对象是否是可调用类型。
callable(object) -> bool ==》 Return whether the object is callable。
阅读(620) | 评论(0) | 转发(0) |