Python零基础教程:函数和类内建魔法属性

枫铃3年前 (2021-10-03)Python251

前言

关于对象的魔法方法我们已经讲得太多,但是对于类或函数内建的魔法属性和功能我们涉及较少,下面系统了解一下类和函数的内建属性。

查看内建属性

class Person(object):
    pass

def get_name():
    pass

if __name__ == "__main__":
    person = Person()
    print(dir(get_name))
    print(dir(Person))
    print(dir(person))
# 结果
['__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__']
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']

比较一下发现类和它的实例内建的属性和方法是一样的,函数似乎比类的内建的属性和方法更多,分离出属性:

  • 类的内建属性有:
'__class__', '__dict__', '__doc__', '__module__', '__weakref__'
  • 函数的内建属性有:
'__annotations__', '__class__', '__closure__', '__code__', '__defaults__', '__dict__','__doc__', '__kwdefaults__', '__module__', '__name__','__qualname__',__globals__

前面我们基本介绍过来类的内建属性,现在重点针对函数的内建属性。

函数的内建属性

内建属性是不能在函数的作用域内直接使用的,因为它们没有被显性地定义,它们需要通过函数变量来调用。

  • _annotations_

记录函数的参数和返回值的类型,前提是定义时指定了类型,否则为{}.

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def get(x:int, y:int) -> int:
    return x + y

print(get.__annotations__) # {'x': <class 'int'>, 'y': <class 'int'>, 'return': <class 'int'>}
  • _class_

python万物皆对象,所以函数也是一个对象,可以看做简化版的类的实例,它的类对象就是FunctionType。

def get(x:int, y:int) -> int:
    return x + y
print(get.__class__) # <class 'function'>
  • __defaults____kwdefaults__

__defaults__属性用来存储参数的默认值,是一个元组,如果没有默认值为None。

def get(x:int=1, y:int=3) -> int:
    return x + y
print(get.__defaults__) # (1, 3)

__kwdefaults__记录强制关键字参数的默认值,字典形式,没有置为None。

def get(x:int, y:int, *, age=20):
    pass
print(get.__kwdefaults__) # {'age':20}

# 函数*后面的参数表示强制关键字参数,即一定要:
get(3,4,age=30)这种方式调用
  • __name___qualname_

__name____qualname__分别表示函数的名字和合法名,__name__仅仅是函数名字,而__qualname__会用点示法显示函数所在的类和模块。

  • __doc___module_:和类的该属性一样,__doc__记录该函数的说明,__module__表示函数定义的模块的名字。

  • _globals_:函数定义所在模块的全局命名空间的字典的引用。

  • _closure_:以包含cell的元组形式返回闭包所包含的自由变量。

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def name(x=2):
    c = 0
    def name1(y):
        return x + y + c
    return name1
n = name()
print(n.__closure__)
# 结果
(<cell at 0x000001B1B201EEB8: int object at 0x00000000619760C0>, 
<cell at 0x000001B1BAEFB768: int object at 0x0000000061976100>)
# 这里的自由变量指的是y和c
  • _dict_

既然函数也是对象,那么它也应该有自己的属性,默认为{}.

def get(x:int=1, y:int=3) -> int:
    return x + y
get.name = 'get'
print(get.__dict__) # {'name':'get'}

_code_:返回已编译的函数对象,CodeType对象。

总结

以上是普通的自定义函数的内建属性,它和生成器函数、协同函数的概念是不一样的;

对于普通的业务开发来说,需要用到的内建属性一般为:__defaults__,__name__,__doc__.

相关文章

python中的del,remove,pop有什么区别

python中有3个删除元素的方法:del remove pop 虽然它们都是删除元素,用于删除列表、字符串等里面的元素...

分享8点超级有用的Python编程建议

分享8点超级有用的Python编程建议

1. 项目文件事先做好归档 每次开始一个新工作的时候,以前的我总是贪图方便,Code、Data、文档都集中放在一个文件夹内&#x...

相关与卷积(数字信号处理)的数学原理及 Python 实现

相关与卷积(数字信号处理)的数学原理及 Python 实现

数学原理    在数字信号处理中,相关(correlation)可以分为互相关(cross correlation)和自相关(auto-corr...

python重要函数eval

1.参数会作为一个 Python 表达式(从技术上说是一个条件列表)被解析并求值 >>> x = 1...

Django之session验证的三种姿势

Django之session验证的三种姿势

一.什么是session session是保存在服务端的键值对,Django默认支持Session,并且默认是将Session数...

Python的 is 和 == 弄懂了吗?

在Python中一切都是...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。