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:

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

Python学习 Part7:类的更多相关文章

  1. Python学习:类和实例

    Python学习:类和实例 本文作者: 玄魂工作室--热热的蚂蚁 类,在学习面向对象我们可以把类当成一种规范,这个思想就我个人的体会,感觉很重要,除了封装的功能外,类作为一种规范,我们自己可以定制的规 ...

  2. Python学习笔记——类和对象

    类和对象 1. 一个例子 # 对象 = 属性 + 方法 # Python 中的类名称约定首字母大写,而 Python 函数名首字母小写 class Turtle: #属性 color = 'green ...

  3. python学习19类5之多态与鸭子模型

    '''''''''一.多态1.Python中多态是指一类事物有多种形态.''' class Animal: def run(self): raise AttributeError('子类必须实现这个方 ...

  4. Python学习-day7 类 部分socket

    这周还是继续关于类的学习,在面向对象的学习过程中又学习了网络编程,并且提交了编写FTP的作业. 复习一下类的相关概念和定义 类      属性           实例变量:内存中           ...

  5. python学习08——类

    笨办法学python第42节,这节讲的是类,程序沿用上一节中一个游戏,不同的是这一节用了类的方法. 其中改动的代码主要如下 原来的最后几句用了这样的代码: ROOMS = { 'death':deat ...

  6. Python学习_11_类和实例

    类和实例 类是对象创建实例的模板,而实例则是对象的实体.类使用class关键字定义: class MyClass:    pass python中创建实例直接使用工厂函数(类名加上一对括号),和其他的 ...

  7. 廖雪峰Python学习笔记——类和实例

    Class MyList(list): __metaclass__ = ListMetaclass #它表示在创建MyList这个类时,必须通过 ListMetaclass这个元类的LIstMetac ...

  8. python学习-- class 类中需要注意的地方

    from django.db import models class Person(models.Model):     name = models.CharField(max_length=30) ...

  9. python学习-62 类属性的增 删 该 查

    类属性 1.类属性 类属性又称为静态变量,或者是静态数据.这些数据是与它们所属的类对象绑定的,不依赖于任何类实例. 2.增 删 改 查 class zoo: country = 'china' def ...

随机推荐

  1. (NO.00001)iOS游戏SpeedBoy Lite成形记(八)

    前一篇提到,如果要想动态修改选手的速度需要在update方法中添加代码. 因为update方法在游戏每一帧都会调用,所以我们不可能修改的太频繁.否则一来对性能有影响,而来玩家表现的极不自然,像抽风一样 ...

  2. Android For JNI(六)——交叉编译,NDK概述以及文件结构,编写自己的第一个JNI工程

    Android For JNI(六)--交叉编译,NDK概述以及文件结构,编写自己的第一个JNI工程 终于回到我们的 android了,我们先要配置这个NDK的环境,但是之前,我们还要了解一下基本的术 ...

  3. ORM对象关系映射之GreenDAO高级用法

    CRUD 增加: dao.insert(Student entity);//添加一个 dao.insertInTx(Student... entity);//批量添加 删除: dao.deleteBy ...

  4. 使用Multiplayer Networking做一个简单的多人游戏例子-3/3(Unity3D开发之二十七)

    使用Multiplayer Networking做一个简单的多人游戏例子-1/3 使用Multiplayer Networking做一个简单的多人游戏例子-2/3 使用Multiplayer Netw ...

  5. MySql常用操作语句(1:启动、连接数据库及用户操作)

    下方将个人常用的MySql操作语句(Win7下)总结如下: 1. 启动与关闭数据库 “管理员”权限, MySql安装目录下bin目录//:  1.1 启动 @>net start mysql   ...

  6. Leetcode_205_Isomorphic Strings

    本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/46530865 Given two strings s an ...

  7. 【LaTeX排版】LaTeX论文排版<三>

    A picture is worth a thousand words(一图胜千言).图在论文中的重要性不言而喻,本文主要讲解图的制作与插入. 1.图像的插入     图像可以分为两大类:位图和向量图 ...

  8. Media Player Classic - HC 源代码分析 4:核心类 (CMainFrame)(3)

    ===================================================== Media Player Classic - HC 源代码分析系列文章列表: Media P ...

  9. 恶补web之八:jQuery(2)

    jquery中非常重要的部分,就是操作dom的能力: text() - 设置或返回所选元素的文本内容 html() - 设置或返回所选元素的内容(包括html标记) val() - 设置或返回表单字段 ...

  10. python之多继承与__mro__的使用

    1 class Base(object): def text(self): print('------text-----') class A(Base): def text(self): print( ...