温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

名称空间-作用域-装饰器

发布时间:2020-08-02 22:06:38 来源:网络 阅读:241 作者:DevOperater 栏目:编程语言

1.名称空间

1.1含义

名称空间正是存放名字x与1绑定关系的地方

1.2名称空间种类

locals:是函数内的名称空间,包括局部变量和形参
globas:全局变量,函数定义所在模块的名字空间
builtins:内置模块的名字空间

1.3作用域

作用域即范围:
全局范围:全局存货,全局有效
局部范围:临时存活,局部有效
查看作用域的方法globals(),locals()

>>> locals()
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_import
lib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins'
(built-in)>, 'l': [2, 3, 4, 5, 6, 7], 's': bytearray(b'aoaini'), 'd': {10: 2, 12: 1, 9: 0}, 'a': [1
, 2, 3, 4, 5], 'b': ['a', 'b', 'c']}
>>> globals()
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_import
lib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins'
(built-in)>, 'l': [2, 3, 4, 5, 6, 7], 's': bytearray(b'aoaini'), 'd': {10: 2, 12: 1, 9: 0}, 'a': [1
, 2, 3, 4, 5], 'b': ['a', 'b', 'c']}
>>>

1.4作用域查找顺序

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita

level = 'L0'
n = 22

def func():
    level = 'L1'
    n = 33
    print(locals())

    def outer():
        n = 44
        level = 'L2'
        print(locals(),n)

        def inner():
            level = 'L3'
            print(locals(),n) #此外打印的n是多少?
        inner()
    outer()

func()

E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
{'n': 33, 'level': 'L1'}
{'level': 'L2', 'n': 44} 44
{'level': 'L3', 'n': 44} 44

Process finished with exit code 0

LEGB代表变量查找顺序:locals->enclosing function ->globals ->builtins
locals:函数内的名字空间,包括局部变量和形参
enclosing外部嵌套函数的名字空间
globals全局变量,函数定义所在模块的名字空间
builtins内置模块的名字空间

1.5闭包

在外部函数中定义了一个内部函数,内函数中使用了外部函数中的临时变量,并且外部函数的返回值是内部函数的引用,这样就形成了闭包。
一般情况下我们认为,如果一个函数结束,函数内部所有的东西都会在内存中被释放掉,还给内存,局部变量消失。但是闭包是一种特殊情况,如果外部函数结束的时候,发现自己的局部变量还会在内部函数中使用,就会把这个局部变量绑定给内部函数,然后自己再结束。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita

def outer(a):
    b = 23

    def inner():
        print(a+b)
    return inner
inner_fun = outer(12)
inner_fun()

E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
35

Process finished with exit code 0

1.6装饰器

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
user_status = False
def login(func): #把要执行的模块从这里传进来

    def inner():#再定义一层函数
        _username = "vita" #假装这是DB里存的用户信息
        _password = "123" #假装这是DB里存的用户信息

        global user_status

        if user_status == False:
            username = input("user:")
            password = input("pasword:")

            if username == _username and password == _password:
                print("welcome login....")
                user_status = True
            else:
                print("wrong username or password!")

        if user_status == True:
            func() # 看这里看这里,只要验证通过了,就调用相应功能

    return inner #用户调用login时,只会返回inner的内存地址,下次再调用时加上()才会执行inner函数
@login
def america():

    print("----欧美专区----")
america()
# 上面代码相当于下面的内容
 "函数开始执行到@login时做的事"
# inner_fun = login(america) 
 "真正调用america()函数,执行inner函数"
# inner_fun()  
def japan():
    print("----日韩专区----")

@login
def henan():
    print("----河南专区----")
henan()

E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
user:vita
pasword:123
welcome login....
----欧美专区----
----河南专区----

Process finished with exit code 0

1.7函数带参数的装饰器

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
user_status = False
def login(func): #把要执行的模块从这里传进来

    def inner(*args,**kwargs):#再定义一层函数
        _username = "vita" #假装这是DB里存的用户信息
        _password = "123" #假装这是DB里存的用户信息

        global user_status

        if user_status == False:
            username = input("user:")
            password = input("pasword:")

            if username == _username and password == _password:
                print("welcome login....")
                user_status = True
            else:
                print("wrong username or password!")

        if user_status == True:
            func(*args,**kwargs) # 看这里看这里,只要验证通过了,就调用相应功能

    return inner #用户调用login时,只会返回inner的内存地址,下次再调用时加上()才会执行inner函数
@login
def america(style):
    print("style:",style)
    print("----欧美专区----")
america("america")
# 上面的代码相当于
# inner_fun = login(america)
# inner_fun("america")
def japan():
    print("----日韩专区----")

@login
def henan(style):
    print("style:", style)
    print("----河南专区----")
henan("china")

E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
user:vita
pasword:123
welcome login....
style: america
----欧美专区----
style: china
----河南专区----

Process finished with exit code 0

1.8带参数的装饰器

 #!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
user_status = False
def login(login_type):
    def auth(func): #把要执行的模块从这里传进来

        def inner(*args,**kwargs):#再定义一层函数
            _username = "vita" #假装这是DB里存的用户信息
            _password = "123" #假装这是DB里存的用户信息

            global user_status

            if user_status == False and login_type == "qq":
                username = input("user:")
                password = input("pasword:")

                if username == _username and password == _password:
                    print("welcome login....")
                    user_status = True
                else:
                    print("wrong username or password!")

            if user_status == True and login_type == "qq":
                func(*args,**kwargs) # 看这里看这里,只要验证通过了,就调用相应功能

        return inner #用户调用login时,只会返回inner的内存地址,下次再调用时加上()才会执行inner函数
    return auth
@login("qq")
def america(style):
    print("style:",style)
    print("----欧美专区----")
america("america")
# 上面的代码相当于
# auth = login("qq")
# inner_fun = auth(america)
# inner_fun("america")
def japan():
    print("----日韩专区----")

# 由于这里是不是qq登录,所以没有执行
@login("weixin")
def henan(style):
    print("style:", style)
    print("----河南专区----")
henan("china")

E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
user:vita
pasword:123
welcome login....
style: america
----欧美专区----

Process finished with exit code 0
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI