Dive in Python学习笔记四:自省的威力


 

自省(即Java中的反射)是指代码可以查看内存中以对象形式存在的其它模块和函数,获取它们的信息,并对它们进行操作。用这种方法,你可以定义没有名称的函数,不按函数声明的参数顺序调用函数,甚至引用事先并不知道名称的函数。

 

使用可选参数和命名参数

Python 允许函数参数有缺省值;如果调用函数时不使用参数,参数将获得它的缺省值。此外,通过使用命名参数还可以以任意顺序指定参数。如:

info 函数就是这样一个例子,它有两个可选参数。

def info(object, spacing=10, col lapse=1):

# doSomething

说明:函数info中,spacing 和collapse 是可选参数,因为它们已经定义了缺省值。object 是必备参数,因为它没有指定缺省值。如果调用info 时只指定一个参数,那么spacing缺省为10 ,collapse 缺省为1。如果调用info 时指定两个参数,collapse 依然默认为1。调用时如果指定collapse参数,必须也同时指定object和spacing参数。

 

但是在Python 中,参数可以通过名称以任意顺序指定。如:

info(odbchelper, collapse=0)

info(spacing=15, object=odbchelper)

 

使用type,str,dir和其他内置函数

1. type函数

type 函数返回任意对象的数据类型。type 可以接收任何东西作为参数。

>>> type(1)

>>> li = []

>>> type(li)

 

 

2. str函数

str 将数据强制转换为字符串。每种数据类型都可以强制转换为字符串。类似于Java中每个对象都可以调用toString()方法转换为字符串。

>>> str(1)

'1'

>>> horsemen

['war', 'pestilence', 'famine']

>>> str(horsemen)

"['war', 'pestilence', 'famine']"

>>> str(odbchelper)

""

>>> str(None)

'None'

 

3. dir函数

dir 函数返回任意对象的属性和方法列表。

>>> li = []

>>> dir(li)

['append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

说明:li 是一个列表,所以dir(li) 返回一个包含所有列表方法的列表。注意返回的列表只包含了字符串形式的方法名称,而不是方法对象本身。

 

4. callable函数

callable 函数,它接收任何对象作为参数,如果参数对象是可调用的,返回True;否则返回False。可调用对象包括函数、类方法,甚至类自身。

>>> import string

>>> string.punctuation

'!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'

>>> string.join

 

>>> callable(string.punctuation)

False

>>> callable(string.join)

True

 

通过getattr获取对象引用

getattr可以返回任何对象的任何属性。

1. 作用于内置类型对象

>>> li = ["Larry", "Curly"]

>>> getattr(li, "append")("Moe")

>>> li

["Larry", "Curly", "Moe"]

 

2. 作用于模块

>>> import odbchelper

>>> odbchelper.buildConnectionString

 

>>> getattr(odbchelper, "buildConnectionString")

 

说明:

(1)使用getattr,你能够获得同一函数的同一引用。通常,getattr(object, "attribute") 等价于object.attribute。

(2)getattr 能够使用可选的第三个参数,一个缺省返回值。

 

过滤列表

过滤列表语法:

[mapping-expression for element in source-list if filter-expression]

以if 开头的是过滤器表达式。过滤器表达式可以是返回值为真或者假的任何表达式(在Python 中是几乎任何东西)。任何经过滤器表达式演算值为真的元素都可以包含在映射中。其它的元素都将忽略,它们不会进入映射表达式,更不

会包含在输出列表中。

>>> li = ["a", "mpilgrim", "foo", "b", "c", "b", "d ", "d"]

>>> [elem for elem in li if len(elem) > 1]

['mpilgrim', 'foo']

 

and和or的特殊性质

在Python 中,and 和or 执行布尔逻辑演算,但是它们并不返回布尔值,而是返回它们实际进行比较的值之一。

1. and介绍

>>> '' and 'b'

''

>>> 'a' and 'b' and 'c'

'c'

说明:使用and 时,在布尔环境中从左到右演算表达式的值。如果布尔环境中的某个值为假,则and 返回第一个假值。如果所有值都为真,所以and 返回最后一个真值。

 

2. or介绍

>>> 'a' or 'b'

'a'

>>> '' or 'b'

'b'

>>> '' or [] or {}

{}

说明:

使用or 时,在布尔环境中从左到右演算值,就像and 一样。如果有一个值为真,or 立刻返回该值。如果所有的值都为假,or 返回最后一个假值。注意or 在布尔环境中会一直进行表达式演算直到找到第一个真值,然后就会忽略剩余的比较值。

 

使用and-or技巧

Python中没有问号表达式,但可以通过and-or来实现相同的功能。如:

>>> a = "first"

>>> b = "second"

>>> true and a or b

'first'

>>> false and a or b

'second

但是如果a的值为假,这种技巧就会失效,保险的方法是是a成为[a] 、b 成为[b],然后使用返回值列表的第一个元素,应该是a 或b中的某一个。

>>> a = ""

>>> b = "second"

>>> (True and [a] or [b] )[0]

''

使用lambda函数

lambda函数是一种快速定义的单行函数。

>>> g = lambda x: x*2

>>> g(3)

6

>>> (lambda x: x*2)(3)

6

说明:在参数列表周围没有括号,而且忽略了return 关键字(隐含存在,因为整个函数只有一行)。而且,该函数没有函数名称,但是可以将它赋值给一个变量进行调用。总的来说,lambda 函数可以接收任意多个参数(包括可选参数) 并且返回单个表达式的值。lambda 函数不能包含命令,包含的表达式不能超过一个。

 

注意:在Python,可以使用== None 或者is None 进行判断某对象是否为null,但是is None 更快


 

 

摘自 蓝猫的专栏

 

相关内容

    暂无相关文章

评论关闭