文章目录

  • global与nonlocal
  • 继承和多态

global与nonlocal

1.函数内部定义的为局部变量,其作用域是局部作用域,函数外无法调用的
2.函数外定义的为全局变量,其作用域是全局作用域,如果在函数内想要进行修改,需要使用global修饰变量
3.外层函数的变量,如果想要在内层函数进行修改,需要nonlocal
关于这部分,有一篇博文写得很详细,通过看他的这篇博文,我已经看懂了两个修饰词的作用。
python:函数作用域 global与nonlocal
大家感兴趣的可以去看看。上一段我修改过的代码:

span = '123'def scope_test():def do_local():spam = "local spam"span = 'local'def do_nonlocal():nonlocal spamglobal spanspam = "nonlocal spam"span = "global"def do_global():global spamglobal spanspan = 'global'spam = "global spam"spam = "test spam"do_local()print("After local assignment:", spam, span)do_global()print("After global assignment:", spam, span)do_nonlocal()print("After nonlocal assignment:", spam, span)scope_test()
print("In global scope:", spam, span)

这是对网上的一段代码进行了改进,别人的那个示例按照顺序,容易误导别人。大家关注我这里do_global和do_nonlocal的调用顺序。
运行结果:

刚开始看别人的代码,我很疑惑,为什么别人的运行结果,调用了global,结果还是nonlocal,见下图:

后面仔细理解才发现,因为没有全局变量spam,所以执行了global修饰的spam,并没有什么作用。而是直接打印了spam,由于上一次执行了nonlocal spam,所以spam的结果是nonlocal spam。
然后我的代码里面,do_nonlocal也是用的global span,而不是用nonlocal span,是因为没有局部变量span,编译会报错。

这里说明一个问题,global 修饰的变量可以不存在,编译不会报错,nonlocal修饰的变量必须要存在,否则编译会报错。
下面用一段代码验证:

str1 = '123'def test1():def test2():nonlocal str2str2 = 'str2_test2'print(str2)nonlocal str1str1 = 'str1_test2'print(str1)def test3():global str1str1 = 'str1_test3'print(str1)global str2str2 = 'str1_test3'print(str2)str2 = '456'test3()test2()

编译报错:

表示str1不能用nonlocal修饰。

str1 = '123'def test1():def test2():nonlocal str2str2 = 'str2_test2'print('str2 = ', str2)global str1str1 = 'str1_test2'print('str1 = ', str1)def test3():global str1str1 = 'str1_test3'print('str1 = ', str1)global str2str2 = 'str2_test3'print('str2 = ', str2)str2 = '456'test3()print("After global assignment:", str1, str2)test2()print("After nonlocal assignment:", str1, str2)test1()

这段代码把test2里面的nonlocal str1改成了global str1,然后输出也加了打印语句,运行结果:

因为先调用test3,使用了global str2,并且str2 = ‘str2_test3’,但是在运行以后,打印出来的str2任然是456,这就说明了,global修饰了str2,但是没有全局str2,编译不会报错,运行也不会报错。

再次调用test3,结果为:str2_test2,并没有对str2的值有改变。

继承和多态

划重点:
Python 中所有的方法实际上都是 virtual 方法。
这和其他语言不一样。

class CA:def myPrint(self):print('这是CA')class CB(CA):def myPrint(self):CA.myPrint(self)print('  这是CB')class CC(CA):def myPrint(self):CA.myPrint(self)print('  这是CC')ca = CA()
cb = CB()
cc = CC()def runTest(ca):ca.myPrint()for item in [ca, cb, cc]:runTest(item)

运行结果:

这里体现了子类中重载函数时,可以先调用基类中的方法,然后再继续实现自己的功能。

除了单重集成以外,还可以有多重继承,原理和单重继承一样,这里就不再细说了。

python学习-类(global、nonlocal、继承、多态)相关推荐

  1. python--编写程序:实现乐手弹奏乐器,乐手可以弹奏不同的乐器而发出不同的声音------使用类的封装继承多态的问题/使用面向对象的思想,设计自定义类,描述出租车和家用轿车的信息

    编写程序:实现乐手弹奏乐器,乐手可以弹奏不同的乐器而发出不同的声音 ------使用类的封装继承多态的问题 class Instrumnet():#乐器类def make_sound(self):pa ...

  2. day24 python学习 类 画元,命名空间作用域,组合,人狗大战升级

    类命名空间与对象.实例的命名空间 创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性 而类有两种属性:静态属性和动态属性 静态属性就是直接在类中定义的变量 动态属性就 ...

  3. Python学习之封装、继承、多态详解

    面向对象的三大特征 封装 确保对象中的数据安全 继承 保证了对象的可扩展性 多态 保证了程序的灵活性 封装 封装是面向对象的三大特性之一 封装指的是隐藏对象中一些不希望被外部所访问到的属性或方法 如何 ...

  4. Python学习——类与对象

    一.编程的两大思想 (1)面向过程 事物比较简单,用简单的线性思维即可解决 (2)面向对象 事物比较复杂,用简单的线性思维无法解决 (3)两者之间的关系 在面对复杂的问题时,宏观上是使用面向对象,但具 ...

  5. C++学习笔记:(五)继承 多态

    目录 7.组合.继承与多态性 7.1 组合 7.2 继承 7.3继承和组合 7.4构造与析构顺序 7.5派生类重载基类函数的访问 7.6多态性&虚函数 7.7纯虚函数和抽象基类 7.8 多重继 ...

  6. C++学习笔记系列之继承多态

    一.移动语义 1.右值引用      有一种机制,可以在语法层面识别出临时对象,在使用临时对象构造新对象(拷贝构造)的时候,将临时对象所持有的资源『转移』到新的对象中,就能消除这种不必要的拷贝. 2. ...

  7. 【Python成长之路】python 基础篇 -- global/nonlocal关键字使用

    课程起源 有一次在工作中编写python工具时,遇到一个 问题:从配置文件读取变量A后,无法在内存中把A的值改变成新的内容.为了解决"更新内存中变量"的这个问题,查找了一些帖子,结 ...

  8. python学习--类、模块、包

    目录 面向对象编程思想 类的特点 类的定义 类的变量 类的方法 类中的方法 类方法 静态方法 实例方法 类的继承 子类的定义 覆写父类的方法 私有化 下划线相关变量命名 模块 包 面向对象编程思想 类 ...

  9. python类定义中__init__()_转:python学习——类中为什么要定义__init__()方法

    学习Python的类,一直不太理解为什么一定要定义init()方法,现在简要谈一下自己的理解吧. 1.不用init()方法定义类 定义一个矩形的类,目的是求周长和面积. 1 classRectangl ...

最新文章

  1. uninque()用法
  2. Android SystemServiceManager分析
  3. MySQL利用存储过程清除所有表中的所有记录
  4. mysql 信号_MySQL
  5. alter table锁表,MySQL出现Waiting for table metadata lock的场景浅析及解决方案
  6. HTML CSS设计与构建网站
  7. Rust Async: Pin概念解析
  8. 360se html怎么删除,如何卸载360浏览器?怎么彻底删除360浏览器?
  9. java文件gzip解压_如何在Java中解压缩GZip文件?
  10. 怎么把外部参照合并到图纸_如何在CAD制图中将两个图合并到一个图纸上
  11. WEB开发(2) Servlet
  12. 帅爆! 赛博朋克特效实现
  13. SQL出现MSDB置疑
  14. c语言1076素数,九度OJ 1076:N的阶乘 题解
  15. 论文阅读《Expert Training Task Hardness Aware Meta-Learning for Few-Shot Classification》
  16. 爱的五种语言:创造完美的两性沟通
  17. 完全模拟FIFA2014世界杯 原创求顶!
  18. 哈希表:线性探查法和平方探查法
  19. 用javascript计算PPI
  20. firefox加速技巧

热门文章

  1. SAP HANA Database Explorer 里的 SQL 语句如何排错 trouble shoot
  2. SAP中国招聘内部顾问,工作职责是做客户项目,ABAP开发
  3. Jerry入职SAP成都研究院14周年纪念日
  4. 使用FakeAsync对Angular异步代码进行单元测试
  5. SAP Spartacus RouteGuard路由守卫之CmsPageGuard
  6. SAP Spartacus checkout页面的入口逻辑
  7. when is OData model initialized - finally found done by Framework
  8. jQuery.sap.require
  9. 使用Eclipse连接SAP Netweaver系统遇到的错误消息和解决办法
  10. SAP CRM interaction center呼叫中心的一些性能问题的分析