python基础学习11(核心编程第二版)部分,,#-*-coding


#-*-coding:utf-8-*-

#====================

#File:python

#Author:python

#Date:2014

#====================

__author__=‘Administrator‘

#执行环境

#可调用对象

"""

许多的python对象都是我们所说的可调用的,即是任何能通过函数操作符“()”来调用的对象。要调用可调用对象,

函数操作符得紧跟在可调用对象之后。Python有4种可调用对象:函数,方法,类,以及一些类的实例。记住这些对象的任何引用或者别名都是可调用的。

"""

#func

#内建函数BIF

"""

BIF属性描述

bif.__doc__文档字符串(或None)

bif.__name__字符串类型的文档名字

bif.__self__设置为None(保留给built-in方法)

bif.__module__存放bif定义的模块名字(或None)

"""

printdir(type)

printtype(dir)

#用户定义的函数(UDF)

"""

UDF(User-DefinedFunction,用户定义的函数)通常是用python写的,定义在模块的最高级,因此会作为全局名字空间的一部分(一旦创建好内建名字空间)装载到系统中。

"""

"""

udf.__doc__文档字符串(也可以用udf.func_doc)

udf.__name__字符串类型的函数名字(也可以用udf.func_name)

udf.func_code字节编译的代码对象

udf.func_defaults默认的参数元组

udf.func_globals全局名字空间字典;和从函数内部调用globals(x)一样

udf.func_dict函数属性的名字空间

udf.func_doc(见上面的udf.__doc__)

udf.func_name(见上面的udf.__name__)

udf.func_closure包含了自由变量的引用的单元对象元组

"""

deffoo():

pass

printtype(foo)

#lambda比较特殊

la=lambdax:x*2

printla(2)

printtype(la)

#直接调用type(lambda:1)

print(type(lambda:1))

#看下udf名字中的foo()

printfoo.__name__

#方法

#方法即是类的一个属性而已

"""

内建方法(BIM)

BIM属性描述

bim.__doc__文档字串

bim.__name__字符串类型的函数名字

bim.__self__绑定的对象

bim.__self__说明了一个非常重要的信息是:内建方法返回的是一个对象!!!!!

"""

printfoo.__doc__

#内建方法简单的理解为:内建类型自身所具有的方法,故返回的是一个内建类型!!!

printtype([].append)#<type‘builtin_function_or_method‘>

printdir([].append)

#用户定义的方法(UDM)

"""

UDM(User-definedmethod,用户定义的方法)包含在类定义之中,只是拥有标准函数的包装,仅有定义它们的类可以使用。

如果没有在子类定义中被覆盖掉,也可以通过子类实例来调用它们。正如在13章解释的那样,

UDM与类对象是关联的(非绑定方法),但是只能通过类的实例来调用(绑定方法)。无论UDMs是否绑定,所有的UMD都是相同的类型——“实例方法“,

"""

classC(object):

deffoo(self):pass#定义udm

c=C()#实例化

printtype(C)#<type‘type‘>#类的别名

printtype(c)#<class‘__main__.C‘>#实例的类别

printtype(C.foo)#<type‘instancemethod‘>#非绑定方法类别

printtype(c.foo)#<type‘instancemethod‘>#绑定方法类别

printC.foo#<unboundmethodC.foo>非绑定方法对象

printc.foo#<boundmethodC.fooof<__main__.Cobjectat0x0000000001EA5AC8>>绑定方法对象

"""

UDM属性描述

udm.__doc__文档字符串(与udm.im_fuc.__doc__相同)

udm.__name__字符串类型的方法名字(与umd.im_func.__name__相同)

udm.__module__定义udm的模块的名字(或none)

udm.im_class方法相关联的类(对于绑定的方法;如果是非绑定,那么为要求udm的类)

udm.im_func方法的函数对象(见UDFs)

udm.im_self如果绑定的话为相关联的实例,如果非绑定位为none

"""

"""

我们可以利用类的可调用性来创建实例。“调用”类的结果便是创建了实例,即大家所知道的实例化。类有默认构造函数,

该函数什么都不做,基本上只有一个pass语句。程序员可以通过实现__int__()方法,来自定义实例化过程。实例化调用的任何参数都会传入到构造函数里。

"""

classC1(object):

def__init__(self,*arg):

print‘\n‘.join(arg)

c1=C1()

printc1

c2=C1(‘hello‘)

"""

类的实例

python给类提供了名为__call__的特别方法,该方法允许程序员创建可调用的对象(实例)。默认情况下,__call__()方法是没有实现的,这意味着大多数实例都是不可调用的。然而,如果在类定义中覆盖了这个方法,那么这个类的实例就成为可调用的了。调用这样的实例对象等同于调用__call__()方法。自然地,任何在实例调用中给出的参数都会被传入到__call()__中。……那么foo()就和foo.__call__(foo)的效果相同,

这里foo也作为参数出现,因为是对自己的引用,实例将自动成为每次方

法调用的第一个参数。如果___call___()有参数,比如,(self,arg),那么foo(arg)就和调用foo.__call__(foo,arg)一样

"""

classC2(object):

def__call__(self,*args):

print"iamcallable!calledwithargs:\n",args

cx=C2()

printcx

printcallable(cx)#实例可调用

cx()

cx(3)#一个参数

cx(3,‘python‘,‘not‘)#多个参数

#注意:只要定义类的实现__call__方法,类的实例才能成为可调用

"""

代码对象

一般说来,代码对象可以作为函数或者方法调用的一部分来执行,也可用exec语句或内建函数eval()来执行。从整体上看,一个python模块的代码对象是构成该模块的全部代码。

如果要执行python代码,那么该代码必须先要转换成字节编译的代码(又称字节码)。

这才是真正的代码对象。然而,它们不包含任何关于它们执行环境的信息,这便是可调用物存在的原因,它被用来包装一个代码对象并提供额外的信息。

"""

#callable(object)

#说明::检查对象object是否可调用。如果返回True,object仍然可能调用失败;但如果返回False,调用对象ojbect绝对不会成功。

printcallable(1)#数字:False

printcallable(int)#内建函数True

#自定义

deffoox():pass

printcallable(foox)#函数True

printcallable(C)#类True

#compile(source,filename,mode[,flags[,dont_inherit]])->codeobject

#将source编译为代码或者AST对象。代码对象能够通过exec语句来执行或者eval()进行求值。

"""

参数source:字符串或者AST(AbstractSyntaxTrees)对象。

参数filename:代码文件名称,如果不是从文件读取代码则传递一些可辨认的值。

参数model:指定编译代码的种类。可以指定为‘exec’,’eval’,’single’。

参数flag和dont_inherit:这两个参数暂不介绍,可选参数。

"""

code1=‘foriinrange(10):printi‘

comx=compile(code1,‘‘,‘exec‘)

execcode1

s1=‘3*4*5‘

a=compile(s1,‘‘,‘eval‘)

printeval(a)

"""

eval求值,与自己使用

single可执行语句【与exec一起使用】

exec执行语句组,与自己使用

"""

#求值

printeval(compile(‘100+100‘,‘‘,‘eval‘))

#单一语句

sing_code=compile(‘print"helloworld!"‘,‘‘,‘single‘)

execsing_code

#语句组

#exec_code=compile("""

#req=input(‘num:‘)

#foriinrange(req):

#printi""",‘‘,‘exec‘)

#execexec_code

##eval(expression[,globals[,locals]])

"""

如果你省略了一个或者两个名称空间参数,那么当前的全局和局部名称空间就被使用.如果一个函数体内嵌嵌套函数或lambda匿名函数时,同时又在函数主体中使用exec或execfile()函数时,由于牵到嵌套作用域,会引发一个SyntaxError异常.(此段原文:Ifyouomitoneorbothnamespaces,thecurrentvaluesoftheglobalandlocalnamespacesareused.Also,duetoissuesrelatedtonestedscopes,theuseofexecorexecfile()insideafunctionbodymayresultinaSyntaxErrorexceptionifthatfunctionalsocontainsnestedfunctiondefinitionsorusesthelambdaoperator.)

在Python2.4中俺未发现可以引起异常

注意例子中exec语句的用法和eval(),execfile()是不一样的.exec是一个语句(就象print或while),而eval()和execfile()则是内建函数.

exec(str)这种形式也被接受,但是它没有返回值。

当一个字符串被exec,eval(),或execfile()执行时,解释器会先将它们编译为字节代码,然后再执行.这个过程比较耗时,所以如果需要对某段代码执行很多次时,最好还是对该代码先进行预编译,这样就不需要每次都编译一遍代码,可以有效提高程序的执行效率。

compile(str,filename,kind)函数将一个字符串编译为字节代码,str是将要被编译的字符串,filename是定义该字符串变量的文件,kind参数指定了代码被编译的类型--‘single‘指单个语句,‘exec‘指多个语句,‘eval‘指一个表达式.cmpile()函数返回一个代码对象,该对象当然也可以被传递给eval()函数和exec语句来执行

"""

"""

对表达式求值,source是字符串或预编译代码对象.globals必须是字典,是source的全局名称空间.

locals可以是任意的映射对象(实现了__getitem__()方法的对象),globals和locals默认是globals()和locals()返回的值.

如果只传入了globals参数,那么该字典也会作为locals传入.

[,globals[,locals]虽然是可选的,但是如果给出参数,globals必须是字典,locals可以是任何映射对象

"""

#例子

printeval(‘100+200‘)

#exec语法

"""

exec语句用来执行储存在字符串或文件中的Python语句。例如,我们可以在运行时生成一个包含Python代码的字符串,然后使用exec语句执行这些语句。

"""

exec‘print"hell"‘

#exec还支持文件对象

"""

f=open(‘a.txt‘,‘r‘)

execf

"""

"""

execfile(file[,globals[,locals]])

execfile()函数与exec语句等价,不同之处在于:execfile()函数执行文件中的语句,而exec语句处理字符串。其中globals和locals参数应是字典,该字典包含文件在执行期间有效的符号表;如果locals参数省略,则所有的引用都使用globals名称空间。如

果两个可选参数都省略,文件就访问运行期间的当前符号表。

"""

python基础学习11(核心编程第二版)部分,布布扣,bubuko.com

python基础学习11(核心编程第二版)部分

评论关闭