自省的 威力

Python 一:自省 

Python 中万物皆对象 

代码可以看内存中以对象形式存在的它模块和函数,获取它们的信息,对它们进行作。 

使用可 参数 和命名 参数 

Python 允许函数参数有省值;如果用函数不使用参数,参数将获它的省值。此,通过使用命名参数可以以任意定参数。 

info函数 

def info(object, spacing=10, collapse=1): 

info 的有用 

info(odbchelper) 
info(odbchelper, 12) 
info(odbchelper, collapse=0)
info(spacing=15, object=odbchelper)

甚至参数 (例如 object,没有省值可以命名参数的方,命名参数可以以任意序出。 

Note: 灵活的函数

用函数时唯必须做事情就一个参数值 (以种方);以何种具体的方你。 


使用 typestrdir 它内置函数 

type 函数

dir 介绍 

>>> li = []
>>> dir(li) (1)
['append', 'count', 'extend', 'index', 'insert',
'pop', 'remove', 'reverse', 'sort']
>>> d = {}
>>> dir(d) (2)
['clear', 'copy', 'get', 'has_key', 'items', 'keys', 'setdefault', 'update', 'values'] >>> import odbchelper
>>> dir(odbchelper) (3)
['__builtins__', '__doc__', '__file__', '__name__', 'buildConnectionString']

  1. (1)  li 是一个列表,以 dir(li) 一个包含有列表方的列表。的列表包含了字符串形式的方法名,不是方对象本

  2. (2)  是一个字典,以 dir(d) 回字典列表。有一个方,keys,看起来挺熟悉的。

  3. (3)  的地方。odbchelper 是一个模块,以 dir(odbchelper)模块中定有部件的列表,包内置的属性,例如__name____doc__,以及其它你属性和方。在这个例中,odbchelper 有一个用的方

    是 callable 函数,它任何对象作参数,如果参数对象是可用的,回 True;回 False。 



    内置函 数 

    typestrdir 它的 Python 内置函数到了 __builtin__ (前分别是划线) 这个特殊的模块中。如果有帮助,你可以认为 Python 在行了 from __builtin__ import *,此将所有的 内置” 函数导入命名空间,以在这个命名空间中可以直接使用这内置函数。 



    通过 getattr 获取对 象

    >>> li = ["Larry", "Curly"]
    >>> li.pop (1)
    <built-in method pop of list object at 010DF884>
    >>> getattr(li, "pop") (2)
    <built-in method pop of list object at 010DF884>
    >>> getattr(li, "append")("Moe") (3)
    >>> li
    ["Larry", "Curly", "Moe"]
    >>> getattr({}, "clear") (4)
    <built-in method clear of dictionary object at 00F113D4> >>> getattr((), "pop") (5)
    Traceback (innermost last):
    File "<interactive input>", line 1, in ? AttributeError: 'tuple' object has no attribute 'pop'

    1. (1)  获取列表的 pop 用。意该不是用 pop ;用 pop 该是 li.pop()。这里指的是方对象本

    2. (2)  回 pop 用,但是此,方法名是作一个字符串参数传递给 getattr 函数的。getattr 是一个有用到信的内置函数,可以任何对象的任何属性。在这个例中,对象是一个 list,属性pop 

    3. (3)  如果不信它是多么的有用,试试这个:getattr 回值是 方,然后可以用它,就像直接使用 li.append("Moe")。但是上你没有直接调用函数;是以字符串形式定了函数

    4. (4)  getattr 可以作用于字典

    5. (5)  理论上,getattr 可以作用于元,但是由没有方,以不管你

      么属性名称 getattr 发一个异常。 


    用于模块的 getattr

    getattr 仅仅适用内置数据类,可作用模块 


    getatt r 作为一 个分发者 

    getattr 见的使用模是作一个分发者 

    import statsout
    def output(data, format="text"): (1)
         output_function = getattr(statsout, "output_%s" % format) (2)
         return output_function(data) (3)

    
    
    (1)  output 函数一个参数 data,和一个可参数 format。如果没有format 参数,省值是 text 完成文本出函数的用。

    (2)  你可以连接 format 参数和 "output_" 来创建一个函数参数,然后从 statsout 模块中该函数。这种方允许后很容易扩展程序以支持其它的格式,修改分发函数。所要仅仅statsout 一个函数,output_pdf,之后要将 “pdf” 为 format 的参数传递给 output 函数可。

    (3)  在你可以单地出函数,就像调它函数一output_function向 statsout 模块中函数的用。 


    你是前面例的一个 Bug?字符串和函数间的合,且没有错误检查。如果用一个格式参数,但是在 statsout中没有定格式输出函数,会发生什?还好,getattr 回 None,它会代一个有函数被赋值给 output_function,然后下一行用函数的出一个 异常。这种方庆幸的是,getattr 使用可的第个参数,一个回值。 

    import statsout
    def output(data, format="text"):
    	output_function = getattr(statsout, "output_%s" % format, statsout.output_text) 	return output_function(data) (1)

    (1) 这个函数用一定可以作,你在用 getattr 了第个参数。第个参数是一个回值,如果第个参数定的属性没能找到,则将这个回值

    如你看到,getattr 的。它是自,在面的章节中你看到它更例。

     

    过滤列 表 

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

    很牛逼的句子,你要看懂前边章节,你就应该能看懂这句


    and 和 or 特殊性质

    and 介绍 

    >>> 'a' and 'b' (1)
    'b'
    >>> '' and 'b' (2)
    ''
    >>> 'a' and 'b' and 'c' (3)
    'c'

    (2)  如果布环境中的值为,则 and 第一个。在这个例中,'' 是第一个
    (3)  ,以 and 一个,'c'


    or 介绍 

    >>> 'a' or 'b' (1)
    'a'
    >>> '' or 'b' (2)
    'b'
    >>> '' or [] or {} (3)
    {}
    >>> def sidefx():
    ... print "in sidefx()"
    ... return 1
    >>> 'a' or sidefx() (4) 'a'

    (1)  使用 or ,在布环境中从右演算值,就像 and 。如果有一个值为,or 。本例中,'a是第一个
    (2)  or 算 '' 值为,然后算 'b值为,回 'b
    (3)  如果有的,or 一个or 算 '' 值为,然后算 [] 值为,依次演算 {} 值为,最回 {} 。 


    bool and A or B

    if bool = 1

    return B

    else

    return A 



















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值