zoukankan      html  css  js  c++  java
  • Python学习 Part7:类

    1. 作用域和命名空间

    命名空间(namespace)就是一个从名称到对象的映射。

    命名空间的一些实例:内置名称集(函数,像abs(),和内置异常名称),一个模块中的全局名称,函数调用时的局部名称。

    命名空间在不同的时刻创建,并且具有不同的生命周期。包含内置名称的命名空间在Python解释器启动时即被创建,并且不会被删除。模块的全局命名空间在模块定义被读取时即被创建,通常模块的命名空间会一直保存到解释器退出。

    [总结]一个模块的引入,函数的调用,类的定义都会引入命名空间,函数中的再定义函数,类中的成员函数定义会在局部namespace中再次引入局部namespace。

    作用域就是一个Python程序可以直接访问命名空间的正文区域。

    一个Python程序的几个作用域:

    • 最里面的局部作用域
    • 外层函数的局部作用域
    • 模块的全局作用域
    • 包含Python内置对象的最外层作用域

    (1)赋值

    赋值操作不会拷贝,只是把名字和对象做一个绑定。也就是赋值语句是起一个绑定或重绑定的作用(bind or rebind)。函数调用的参数传递是赋值,不是拷贝。

    (2)global和nonlocal语句

    global语句用来声明一系列变量,这些变量会引用到当前模块的全局命名空间的变量(module-level namespace),如果该变量没有定义,也会在全局空间中添加这个变量。

    nonlocal语句用来声明一系列的变量,这个声明会从声明处从里到外的namespace去搜寻这个变量(the nearest enclosing scope),直到模块的全局域(不包括全局域),找到了则引用这个命名空间的这个名字和对象,若作赋值操作,则直接改变外层域中的这个名字的绑定。nonlocal语句声明的变量不会在当前scope的namespace字典中加入一个key-value对,如果在外层域中没有找到,则如下报错。

    >>>SyntaxError: no binding for nonlocal 'spam' found

    复制代码
    >>> def test():
        def do_local():
            spam="local spam"
        def do_nonlocal():
            nonlocal spam
            spam="nonlocal spam"
        def do_global():
            global spam
            spam="global spam"
        spam="test spam"
        do_local()
        print("After local assignment: ",spam)
        do_nonlocal()
        print("After nonlocal assignment: ",spam)
        do_global()
        print("After global assignment: ",spam)
    
        
    >>> test()
    After local assignment:  test spam
    After nonlocal assignment:  nonlocal spam
    After global assignment:  nonlocal spam
    >>> print("In global scope: ",spam)
    In global scope:  global spam
    >>> 
    复制代码

     注意:local赋值语句是无法改变scope_test的spam绑定。nonlocal赋值语句改变了scope_test的spam绑定,并且global赋值语句从模块级改变了spam绑定

    2. 类定义语法

    class ClassName:

    当进入类定义时,就会创建一个新的命名空间,并且用作局部作用域。
    当类定义完成时,就创建了一个类对象。

  • 相关阅读:
    Web 自动化测试(Selenium) PO 模型
    Web 自动化测试(Selenium) 鼠标和键盘操作以及浏览器等待
    Web 自动化测试(Selenium)进阶及八大元素定位
    web 自动化测试(Selenium) Xpath 和 Css 定位元素
    没有最全,只有更全的正则表达式集合(持续更新...)
    SQL优化第一篇
    C# 设置桌面为父窗口
    Spring Boot整合MybatisPlus逆向工程(MySQL/PostgreSQL)
    IDEA2020.2版本设置类和方法的自定义注释模板
    记一个Java多线程相关的面试题
  • 原文地址:https://www.cnblogs.com/zhangfeivip/p/8931453.html
Copyright © 2011-2022 走看看