[Dive into Python:第四章]:自省的威力

一、函数定义实例及其解释

def info(object, spacing=10, collapse=1):
    """Print methods and doc strings.

    Takes module, class, list, dictionary, or string."""
    methodList = [method for method in dir(object) if callable(getattr(object, method))]
    processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)
    print "\n".join(["%s %s" %
    (method.ljust(spacing),
    processFunc(str(getattr(object, method).__doc__)))
    for method in methodList])

if __name__ == "__main__":
    print info.__doc__
 """Print methods and doc strings.

    Takes module, class, list, dictionary, or string."""
使用print info.__doc__可以获取此处的说明

methodList = [method for method in dir(object) if callable(getattr(object, method))]

#getattr:获取对象的属性的引用,获取后可以直接调用,例如:
li = ["Larry", "Curly"]
print li.pop            ##<built-in method pop of list object at 010DF884>
print getattr(li, "pop")    ##<built-in method pop of list object at 010DF884>
print li.pop(1)         ##Curly
print getattr(li, "pop")(0) ##Larry

# for method in dir(object):使用dir获取object的属性和方法列表,然后进行遍历
# callable:对象是否为函数,如果是函数则返回true
#过滤列表:Python 具有通过列表解析将列表映射到其它列表的强大能力。
#这种能力同过滤机制结合使用,使列表中的有些元素被映射的同时跳过另外一些元素。
li = ["a", "mpilgrim", "foo", "b", "c", "b", "d", "d"]
li = ["a", "mpilgrim", "foo", "b", "c", "b", "d", "d"]
print li #['mpilgrim', 'foo']

#整体解释:
#遍历对象object的属性,并获取其引用,如果这个属性是一个函数,则使用这个函数生成一个新的列表

processFunc = collapse and (lambda s: ” “.join(s.split())) or (lambda s: s)

#and 和 or 的特 殊性质

#and:对应C/C++的&&。在and语义中,0、''、[]、()、{}、None 在布尔环境中为假,其他均为真。
#对于类,默认为真,也可以特定的方法使得类实例的演算值为假。
#如果布尔环境中的所有值都为真,那么 and 返回最后一个值。
#如果布尔环境中的某个值为假,则 and 返回第一个假值
#and的断路效应:如果前面的语句执行结果为假,则后面的语句不会得到执行
def func1(prm):
    print "prm is:", prm
    return prm

print func1(0) and func1(1)
##prm is: 0 #没有打印prm is:1,说明当前面的语句为假时,会产生断路效应。与C/C++语法一致
##0


#or:使用 or 时,在布尔环境中从左到右演算值,就像 and 一样。如果有一个值为真,or 立刻返回该值(断路)
#如果第一个表达式为假,第二个表达式为真,则返回第二个表达式的结果
#如果两个表达式都为假,则返回最后一个表达式
#or的断路效应示例:
print func1(1) or func1(0)
##prm is: 1
##1

#当第一个表达式为假,第二个表达式为真时,返回第二个表达式的结果
print func1(0) or func1(5)
##prm is: 0
##prm is: 5
##5

#两个表达式都为假时,返回最后一个表达式的值
print func1({}) or func1(())
##prm is: {}
##prm is: ()
##()

******print “\n”.join([“%s %s” %
(method.ljust(spacing),
processFunc(str(getattr(object, method).__doc__)))
for method in methodList])**

二、getattr 常见的使用模式是作为一个分发者

getattr获取模块的属性失败时,返回None。否则返回属性的引用。getattr也可以指定当获取属性失败的时候,返回缺省的属性的引用。

例如,操作不同类型的文件时,可能需要不同的函数,你可以为每种格式定义各自的格式操作函数,然后使用唯一的分发函数调用所需的格式的操作函数。
import fileop   
def filemethod(path, fmt="text"):
    return getattr(fileop,"filemethod_%s",fmt,fileop.filemethod_text))

三、使用 and-or 技巧模拟C/C++的bool?a:b表达式

1 and a or b    #使用的前提条件是,a,b都不为假。如果a为假,则(1 and b)为假,结果会返回b。
0 and a or b    #无前提条件。不管a为真还是假,(0 and a)为假,结果返回b。

#安全使 用 and-or 技巧:将a和b放入列表中,这样不管a和b是否为真,列表一定为真。
a = ""
b = "second"
print len((1 and [a] or [b])[0])    ##0
print ((0 and [a] or [b])[0])       ##second

四、使用 lambda 函数:定义单行的最小函数

lambda 函数可以接收任意多个参数,并且返回单个表达式的值。lambda 函数不能包含命令,包含的表达式不能超过一个。不要试图向 lambda 函数中塞入太多的东西;如果你需要更复杂的东西,应该定义一个普通函数,然后想让它多长就多长。***lambda表达式主要用在需要封装特殊的、非重用代码上,避免令代码充斥着大量单行函数。***
lambda 函数在布尔环境中总是为真。
g = lambda x: x*2
g(3)
##6
(lambda x: x*2)(3)
##6

五、其他

1.在 Python,你可以使用 == None 或者 is None 进行比较,但是 is None 更快。
2.为什么 对一个 doc stri ng 使用 str:如果你直接演算 doc 属性的值,PythonIDE 什么都不会打印。如果使用str,则会打印None。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值