python学习-类(global、nonlocal、继承、多态)
文章目录
- 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、继承、多态)相关推荐
- python--编写程序:实现乐手弹奏乐器,乐手可以弹奏不同的乐器而发出不同的声音------使用类的封装继承多态的问题/使用面向对象的思想,设计自定义类,描述出租车和家用轿车的信息
编写程序:实现乐手弹奏乐器,乐手可以弹奏不同的乐器而发出不同的声音 ------使用类的封装继承多态的问题 class Instrumnet():#乐器类def make_sound(self):pa ...
- day24 python学习 类 画元,命名空间作用域,组合,人狗大战升级
类命名空间与对象.实例的命名空间 创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性 而类有两种属性:静态属性和动态属性 静态属性就是直接在类中定义的变量 动态属性就 ...
- Python学习之封装、继承、多态详解
面向对象的三大特征 封装 确保对象中的数据安全 继承 保证了对象的可扩展性 多态 保证了程序的灵活性 封装 封装是面向对象的三大特性之一 封装指的是隐藏对象中一些不希望被外部所访问到的属性或方法 如何 ...
- Python学习——类与对象
一.编程的两大思想 (1)面向过程 事物比较简单,用简单的线性思维即可解决 (2)面向对象 事物比较复杂,用简单的线性思维无法解决 (3)两者之间的关系 在面对复杂的问题时,宏观上是使用面向对象,但具 ...
- C++学习笔记:(五)继承 多态
目录 7.组合.继承与多态性 7.1 组合 7.2 继承 7.3继承和组合 7.4构造与析构顺序 7.5派生类重载基类函数的访问 7.6多态性&虚函数 7.7纯虚函数和抽象基类 7.8 多重继 ...
- C++学习笔记系列之继承多态
一.移动语义 1.右值引用 有一种机制,可以在语法层面识别出临时对象,在使用临时对象构造新对象(拷贝构造)的时候,将临时对象所持有的资源『转移』到新的对象中,就能消除这种不必要的拷贝. 2. ...
- 【Python成长之路】python 基础篇 -- global/nonlocal关键字使用
课程起源 有一次在工作中编写python工具时,遇到一个 问题:从配置文件读取变量A后,无法在内存中把A的值改变成新的内容.为了解决"更新内存中变量"的这个问题,查找了一些帖子,结 ...
- python学习--类、模块、包
目录 面向对象编程思想 类的特点 类的定义 类的变量 类的方法 类中的方法 类方法 静态方法 实例方法 类的继承 子类的定义 覆写父类的方法 私有化 下划线相关变量命名 模块 包 面向对象编程思想 类 ...
- python类定义中__init__()_转:python学习——类中为什么要定义__init__()方法
学习Python的类,一直不太理解为什么一定要定义init()方法,现在简要谈一下自己的理解吧. 1.不用init()方法定义类 定义一个矩形的类,目的是求周长和面积. 1 classRectangl ...
最新文章
- uninque()用法
- Android SystemServiceManager分析
- MySQL利用存储过程清除所有表中的所有记录
- mysql 信号_MySQL
- alter table锁表,MySQL出现Waiting for table metadata lock的场景浅析及解决方案
- HTML CSS设计与构建网站
- Rust Async: Pin概念解析
- 360se html怎么删除,如何卸载360浏览器?怎么彻底删除360浏览器?
- java文件gzip解压_如何在Java中解压缩GZip文件?
- 怎么把外部参照合并到图纸_如何在CAD制图中将两个图合并到一个图纸上
- WEB开发(2) Servlet
- 帅爆! 赛博朋克特效实现
- SQL出现MSDB置疑
- c语言1076素数,九度OJ 1076:N的阶乘 题解
- 论文阅读《Expert Training Task Hardness Aware Meta-Learning for Few-Shot Classification》
- 爱的五种语言:创造完美的两性沟通
- 完全模拟FIFA2014世界杯 原创求顶!
- 哈希表:线性探查法和平方探查法
- 用javascript计算PPI
- firefox加速技巧
热门文章
- SAP HANA Database Explorer 里的 SQL 语句如何排错 trouble shoot
- SAP中国招聘内部顾问,工作职责是做客户项目,ABAP开发
- Jerry入职SAP成都研究院14周年纪念日
- 使用FakeAsync对Angular异步代码进行单元测试
- SAP Spartacus RouteGuard路由守卫之CmsPageGuard
- SAP Spartacus checkout页面的入口逻辑
- when is OData model initialized - finally found done by Framework
- jQuery.sap.require
- 使用Eclipse连接SAP Netweaver系统遇到的错误消息和解决办法
- SAP CRM interaction center呼叫中心的一些性能问题的分析