zoukankan      html  css  js  c++  java
  • 【python学习】之五、可调用对象

    在python中有四种可调用对象:函数,方法,类,类的实例


    1、函数

    (1)内建函数(BIF    Built-in Function):   用C/C++来写的,在__bulitin__模块里,并作为__builtin__模块导入到解释器中去!

    >>> dir(type)
    ['__abstractmethods__', '__base__', '__bases__', '__basicsize__', '__call__', '__class__', '__delattr__', '__dict__', '__dictoffset__', '__doc__', '__eq__', '__flags__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__instancecheck__', '__itemsize__', '__le__', '__lt__', '__module__', '__mro__', '__name__', '__ne__', '__new__', '__prepare__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasscheck__', '__subclasses__', '__subclasshook__', '__weakrefoffset__', 'mro']
    >>> type(dir)
    <class 'builtin_function_or_method'>

    通过代码可以知道,dir()可以列出函数的多有属性。

    type()返回产生对象的类型!



    (2)用户自定义函数(UDF User-Defined Function)  是用python写的,他定义在模块的最高级!

    从内部机制看,用户自定义函数是”函数“类型的。

    >>> def a():
    	pass
    
    >>> type(a)
    <class 'function'>


    (3)lambda表达式   这里和自定义函数有所不同,这里不是用def创建的函数,而是用lambda关键字!

    >>> b = lambda x: x * x
    >>> b(10)
    100
    >>> type(b)
    <class 'function'>
    >>> a.__name__
    'a'
    >>> b.__name__
    '<lambda>'



    2、方法

    (1)内建方法(BIM built-in Method)     只有内建类型才有内建方法,

    >>> type([].append)
    <class 'builtin_function_or_method'>
    >>> [].append
    <built-in method append of list object at 0x02758148>
    type函数给出了和BIF一样的输出。


    我们再来看一下内建函数作用到内建方法上:dir()

    >>> dir([].append)
    ['__call__', '__class__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__self__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']


    (2)用户定义的方法(UDM  User-defined method) 他包含在类定义中。只是拥有标准函数的包装,仅有定义它们的类可以使用。子类中如果不覆盖那么也可以使用!

    >>> class C(object):        #类
    	def a(self):        #UDM
    		pass
    
    	
    >>> c = C()        #实例化
    >>> type(c)         #实例的类别
    <class '__main__.C'> 
    >>> type(C)           #类的类别
    <class 'type'>
    >>> type(c.a)    #绑定方法的类别
    <class 'method'>
    >>> type(C.a)      #非绑定方法的类别
    <class 'function'>

    3、类

    这里不多说了


    4、类的实例

    在python中提供了一个__call__的特别方法,这个方法允许程序员城建可调用的对象(实例)。

    如:a() 和 a.__call__(a)的效果是相同的。 如果__call__有参数,__call__(self, a)那么调用就会像这样:a(b)  == a.__call__(a, b)!!

    >>> class C(object):
    	def __call__(self, *args):
    		print 'a:\n', args
    
    		
    >>> c = C()      #实例化
    >>> c
    <__main__.C object at 0x025F2ED0>
    >>> callable(c)       #检测实例是否可调用
    True
    >>> c()        #调用实例
    a:
    ()
    >>> c(1)
    a:
    (1,)



    2012/8/7

    jofranks 于南昌

  • 相关阅读:
    Mac上的常用软件
    Mac上在iterm2中使用ls时,出现Operation not permitted
    Typora常用操作
    Mac上的qemusystemaarch64占用太多内存
    软件质量管理总结
    postgres使用记录
    Linux 包含中文字符的文件名无法使用shell 选中或复制
    常见硬件知识
    iterm2 常用操作
    C# 通过 HTTPModule 防范 DOS
  • 原文地址:https://www.cnblogs.com/java20130723/p/3211422.html
Copyright © 2011-2022 走看看