Chinaunix首页 | 论坛 | 博客

分类: Python/Ruby

2014-02-18 23:12:04

    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) |
给主人留下些什么吧!~~