首页 > 编程语言 >Python3中的函数对象

Python3中的函数对象

时间:2023-06-19 13:47:31浏览次数:57  
标签:__ .__ co 函数 对象 add print Python3

在Python中一切皆对象,函数也是一种对象,有相关的属性和方法。
对于任意对象,我们可以用dir()函数来获取其内置的属性及方法名,例如:

def add(a: int, b: int=1) -> int:
    """加法函数"""
    return a + b

print(dir(add))

运行结果如下:

['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

函数常见属性

函数常见属性如下:

属性 返回类型 说明
__name__ str 函数名
__qualname__ str 函数限定名,例如,函数在一个类中时,其限定名为 类名.函数名
__doc__ str or None 函数注释(docstring)
__anotations__ dict or None 函数函数参数及返回值类型注释
__module__ str 函数所属模块名
__class__ 类对象 函数所属类(对象)
__code__ code对象 函数代码(对象)
__defaults__ tuple or None 函数参数默认值
__kwdefaults__ tuple or None 函数函数参数及返回值类型注释
__closure__ tuple of cell or None 闭包函数中引用的自由变量,元祖类型,其中每一个变量是一个cell对象

函数属性使用示例

示例1-函数基本属性

def add(a: int, b: int=1) -> int:
    """加法函数"""
    return a + b

print('函数名:', add.__name__)
print('函数限定名:', add.__qualname__)
print('函数注释(docstring):', add.__doc__)
print('函数参数及返回值类型注释:', add.__annotations__)
print('函数所属类(对象):', add.__class__)
print('函数所属模块名:', add.__module__)
print('函数参数默认值:', add.__defaults__)

输出结果如下:

函数名: add
函数限定名: add
函数注释(docstring): 加法函数
函数参数及返回值类型注释: {'a': <class 'int'>, 'b': <class 'int'>, 'return': <class 'int'>}
函数所属模块名: __main__
函数所属类(对象): <class 'function'>
函数代码(对象): <code object add at 0x1043d0a80, file "/Users/superhin/Library/Application Support/JetBrains/PyCharm2023.1/scratches/scratch_11.py", line 19>
函数参数默认值: (1,)
函数限定关键值参数默认值: None

示例2-函数名及函数限定名

class Calc:
    def add(self, a, b):
        return a + b
print('函数名:', Calc.add.__name__)
print('函数限定名:', Calc.add.__qualname__)

输出结果如下:

函数名: add
函数限定名: Calc.add

示例3-关键字限定参数默认值

函数中可以使用独立的*参数,其后的参数在使用函数时仅可以按key=value形式传参

def add(*, a, b=1):
    return a + b

# add(1,2)  # ❌报错,不允许按位置参数形式使用
# add(a=1, b=2) # 可用
print('函数限定关键值参数默认值:', add.__kwdefaults__)

输出结果如下:

函数限定关键值参数默认值: {'b': 1}

示例4-闭包函数获取自由变量列表

def calc(method, a, b):
    def add():
        return a + b

    if method == 'add':
        return add
    # ...

add = calc('add', 1, 2)  # 得到闭包函数add
print('回调函数中自由变量列表', add.__closure__)
for cell in add.__closure__:
    print('自由变量值:', cell.cell_contents)

输出结果如下:

回调函数中自由变量列表 (<cell at 0x1113caaf0: int object at 0x10c8ef930>, <cell at 0x1113ca9d0: int object at 0x10c8ef950>)
自由变量值: 1
自由变量值: 2

注:由于闭包函数add中未使用外部函数的method变量,因此其不会出现在add的__closure__中。

函数代码对象常见属性

参考:PyCodeObject与Python程序执行

函数的__code__属性返回一个code(Python字节码)对象,该对象常见属性如下:

  • co_filename:代码所在文件路径

  • co_firstlineno: 函数代码第一行行号

  • co_cellvars: tuple cell变量名(参数名)列表

  • co_varnames: tuple 局部变量名列表

  • co_freevars:自由变量名列表

  • co_argcount: int 参数数量(不包含限定关键字参数)

  • co_nlocals:int 局部变量数量

  • co_kwonlyargcount:int 限定关键字参数数量

  • co_posonlyargcount:int 限定位置参数数量

  • co_names:所使用名称列表

  • co_consts:所使用常量列表,包含函数的docstring、代码对象,和内部函数等

  • co_code:bytes 编译后的二进制操作码(opcodes)

  • co_lnotab:地址及代码行号映射编码后的字符串

  • co_flags:标记列表

  • co_stacksize:使用的栈大小

标签:__,.__,co,函数,对象,add,print,Python3
From: https://www.cnblogs.com/superhin/p/python3_function_object.html

相关文章

  • 强化学习从基础到进阶-常见问题和面试必知必答[1]:强化学习概述、序列决策、动作空间
    强化学习从基础到进阶-常见问题和面试必知必答[1]:强化学习概述、序列决策、动作空间定义、策略价值函数、探索与利用、Gym强化学习实验1.强化学习核心概念强化学习(reinforcementlearning,RL):智能体可以在与复杂且不确定的环境进行交互时,尝试使所获得的奖励最大化的算法。动......
  • 面向对象
    面向对象可变个数的形参JDK5.0之前:采用数组形参来定义方法,传入多个同一类型变量publicstaticvoidtest(inta,String[]books);JDK5之后:采用可变个数形参来定义方法,传入多个同一类型变量publicstaticvoidtest(inta,String...books);javaBean类是公共的有一个无参......
  • MySQL时间函数的选择
    Oracle中获取系统当前的时间,可以用sysdate、systimestamp等函数,在MySQL中,同样有类似的函数可以使用,碰巧看到eygle大神最近的文章,短短几行文字,就介绍了MySQL中获取系统当前时间的来龙去脉。在MySQL中,获得系统当前时间可以使用now()函数,这是最简单和应用最广的函数。除此之外,curre......
  • 对象迁移表空间引出的三个小问题
    我们有一个开发库,默认表空间是TEST_TBS,但今天查看开发库的时候,发现有些表和字段并不在用户默认使用的表空间中,而在USERS表空间,之所以可能是之前开发人员执行SQL是从其他库复制过来的,连通tablespaceUSERS名称一块复制了,为了规范,就需要将这些对象转移下表空间,期间碰见了几个常见的......
  • Pycharm中print函数有end= 参数,控制台不打印输出
    Pycharm中print函数有end=参数,控制台不打印输出foriinrange(1,256):#寻找对称平方数square=str(i*i)#转为字符串ifsquare==square[::-1]:print(i,end='\t')循环中print函数有end=参数,无论end='\t'还是end=''end='9'e......
  • C++多态的原理(虚函数指针和虚函数表) --imxiangzi 好好看
     C++多态的原理(虚函数指针和虚函数表)1.虚函数指针和虚函数表2.继承中的虚函数表2.1单继承中的虚函数表2.2多继承中的虚函数表3.多态的原理4.总结1.虚函数指针和虚函数表以下代码:问类实例化出的对象占几个字节?#include<iostream>usingnamespacestd;classA{ intm_a;publi......
  • 【python基础】函数-值传递
    为了更好的认识函数,我们还要研究值传递问题,再研究这个问题之前,我们已经知道了函数之间的值传递,是实参变量值传递给形参变量,然后让形参变量在函数内完成相应的功能。但是因为数据类型的不同,这里的值传递产生的对实参变量的效果是不同的1.传递数据本质参数传递之间传递的肯定是数......
  • 去往js函数式编程(7)
    管道和组合  管道和组合是一种技术,用于设置函数以便它们按顺序工作,使一个函数的输出称为下一个函数的输入。在linux中,执行一个命令并将其输出作为第二个命令的输入,而第二个命令的输出又成为第三个命令的输入,依此类推,这被称为管道。constmarkers=[{name:'AR',lat:-......
  • 20230418 0. 面向对象基础
    面向对象的三大特性:封装、继承、多态面向对象的好处:可维护、可扩展、可复用、灵活性好封装每个对象都包含它能进行操作所需要的所有信息,这个特性称为封装,因此对象不必依赖其他对象来完成自己的操作。封装有很多好处:第一,良好的封装能够减少耦合第二,类内部的实现可以自由地修......
  • 调用拷贝构造函数的场景
    1.默认构造函数默认构造函数是一个系统生成的,参数列表和函数体都为空的函数。如果类中声明了默认构造函数(无论是否有参数),编译器便不再会为之生成隐含的构造函数。2.析构函数析构函数的函数列表为空,因此不能实现重载。可以显式调用析构函数。例如可以通过对象名等进行调用,obj......