情感测试
情感测试

您现在的位置: 情感测试简介_情感测试玩法 > 情感测试规则 > python之深入28

python之深入28

发布时间:2021-8-25 14:40:33   点击数:

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

python有3种不同类型函数对象。第一种是内建函数。编译过后放入python解释器,然后把它们作为第一(内建)名字空间的一部分加载进系统。如前面章节所提到的,这些函数在_bulitin_模块里,并作为__builtins__模块导入到解释器中。

内建函数属性

BIF属性描述

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

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

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

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

从内部机制来看,因为BIFs和内建方法(BIMs)属于相同的类型,所以对BIF或者BIM调用type()的结果是:print(type(dir))

classbuiltin_function_or_method

注意这不能应用于工厂函数,因为type()正好会返回产生对象的类型:

print(type(int))#classtype

UDF(User-DefinedFunction,用户定义的函数)通常是用python写的,定义在模块的最高级,因此会作为全局名字空间的一部分(一旦创建好内建名字空间)装载到系统中。函数也可在其他的函数体内定义,我们现在可以对多重嵌套作用域中的属性进行访问。可以用func_closure属性来钩住在其他地方定义的属性。

用户自定义函数属性

UDF属性描述

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包含了自由变量的引用的单元对象元组

(自用变量在UDF中使用,但在别处定义)

deffoo():pass

print(type(foo))#classfunction

lambda表达式没有给命名绑定的代码提供基础结构,所以要通过函数式编程接口来调用,或把它们的引用赋值给一个变量,然后就可以直接调用或者再通过函数来调用。变量仅是个别名,并不是函数对象的名字。通过lambda来创建函数的对象除了没有命名之外,享有和用户自定义函数相同的属性;__name__或者func_name属性给定为字符串"lambda"。

deffoo():pass

lambdaFunc=lambdax:x*2

lambdaFunc()#

print(type(lambdaFunc))#classfunction

#我们将表达式赋值给一个别名。我们也可以直接在一个lambda表达式上调用type():

print(type(lambda:1))#classfunction

print(foo.__name__)#foo

print(lambdaFunc.__name__)#lambda

用户自定义方法是被定义为类的一部分的函数。许多python数据类型,比如列表和字典,也有方法,这些被称为内建方法。方法通过对象的名字和句点属性标识进行命名。

内建方法(BIM)属性

BIM属性描述

bim.__doc__文档字串

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

bim.__self__绑定的对象

只有内建类型(BIT)有BIM.

对于内建方法,type()工厂函数给出了和BIF相同的输出。BIM和BIF两者也都享有相同属性。不同之处在于BIM的__self__属性指向一个Python对象,而BIF指向None。

print(type([].append))#classbuiltin_function_or_method

print(dir([].append))

UDM(User-definedmethod,用户定义的方法)包含在类定义之中,只是拥有标准函数的包装,仅有定义它们的类可以使用。如果没有在子类定义中被覆盖掉,也可以通过子类实例来调用它们。UDM与类对象是关联的(非绑定方法),但是只能通过类的实例来调用(绑定方法)。无论UDMs是否绑定,所有的UMD都是相同的类型——“实例方法“。

classC(object):#defineclass#定义类

deffoo(self):pass#defineUDM#定义UDM

c=C()#instantiation#实例化

print(type(C))#typeofclass#类的类别classtype

print(type(c))#typeofinstance#实例的类别class__main__.C

#。访问对象本身将会揭示你正在引用一个绑定方法还是非绑定方法。

print(type(C.foo))#typeofunboundmethod#非绑定方法的类别classfunction

print(type(c.foo))#typeofboundmethod#绑定方法的类别classmethod

print(dir(C))

print(dir(c))

用户自定义属性

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__()方法,来自定义实例化过程。实例化调用的任何参数都会传入到构造函数里。

classC(object):

def__init__(self,*args):

print(Instantiatedwiththesearguments:,args)

c1=C()#invokingclasstoinstantiatec1Instantiatedwiththesearguments:()

c2=C(Thenumberofthecountingshallbe,3)#Instantiatedwiththesearguments:(Thenumberofthecountingshallbe,3)

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

记住只有定义类的时候实现了__call__方法,类的实例才能成为可调用的。

classC(object):

def__call__(self,*args):

print("Imcallable!Calledwithargs:",args)

c=C()#instantiation#实例化

print(c)##ourinstance#我们的实例__main__.Cobjectat0xAE6DF0

print(callable(c))#instanceiscallable#实例是可调用的#True

c()#instanceinvoked#调用实例Imcallable!Calledwitharguments:()

c(3)#invokedwith1arg#呼叫的时候给出一个参数Imcallable!Calledwitharguments:(3,)

c(3,nomore,noless)#invokedwith2args#呼叫的时候给出两个参数Imcallable!Calledwithargs:(3,nomore,noless)

每个可调用物的核心都是代码对象,由语句,赋值,表达式,以及其他可调用物组成。一般说来,代码对象可以作为函数或者方法调用的一部分来执行,也可用exec语句或内建函数eval()来执行。从整体上看,一个python模块的代码对象是构成该模块的全部代码。

如果要执行python代码,那么该代码必须先要转换成字节编译的代码(又称字节码)。这才是真正的代码对象。函数对象仅是代码对象的包装,方法则是

给函数对象的包装。

可执行对象和内建函数

内建函数和语句描述

callable(obj)如果obj可调用,返回True,否则返回FALSE



转载请注明:http://www.zmax-alibaba.com/qggz/138056.html

网站简介 | 发布优势 | 服务条款 | 隐私保护 | 广告合作 | 合作伙伴 | 版权申明 | 网站地图

当前时间: