学习python类
类:
Python 类提供了面向对象编程的所有基本特征: 允许多继承的类继承机制, 派生类可以重写它父类的任何方法, 一个方法可以调用父类中重名的方法. 对象可以包含任意数量和类型的数据成员. 作为模块, 类也拥有 Python 的动态特征: 他们可以被动态创建, 并且可以在创建之后被修改.
名称和对象:对象都具有个别性, 多个名称(在多个作用域中) 可以被绑定到同一个对象上. 这就是其他语言中所谓的别名。
作用域和命名空间:
命名空间 是从名称到对象的映射。命名空间是在不同时刻创建的,并且有着不同的生命期。
看了半天没有理解到!!!!感觉一脸懵X.然后翻了一下地球,找到了基本能理解的东东:
#python 中的函数传值还是传引用
# a = 1
# def setvalue(arg):
# arg = 100
# print(arg)
# setvalue(a)
# print(a)
# #会发现最后打印出的 a 仍然是 1 ,看起来像是传值调用
# a = [1]
# def setvalue(arg):
# arg[0] = 100
# print(arg[0])
# setvalue(a)
# print(a[0])
#结果 a 中的数值已经修改成了 100
# a = 1 #1
# a = 2 #2
# b = a #3
# del a
# 正确的理解是 a 引用了 1 这个对象或者将 a 绑定给了 1 ,
# ,而不是将 1 这个值赋给 a 。
# 深入点说,就是 1 这个对象的所有属性包括值都只存在自身,
# a 只是在 1 上打了个标签,并没有将实际的数据拷贝到自身!
# 你只是可以通过命名 a 能够访问到 1 这个对象的信息。
# 而如果执行了上面语句 4 ,
# 含义就是在对象上删掉 a 这个标签,
# 在通过 a 访问时就会报a命名未定义的错误
# 语句 2 会删除掉a在1上的标签,
# 触发python的垃圾回收机制,
# 然后语句 3 会将 b 也绑定到2这个对象上。
#
# 再回到最先的例子中,用刚谈到的对象概念去重新理解。
# 例子1中,在调用函数 setvalue 时,
# 只是将参数 arg 也绑定到 a 所引用的对象 1,
# 但是在 setvalue 函数中,删除掉了 arg 在对象 1 上的标签,
# 重新绑定到了对象 100 上,对 a 是没有影响的。
# 在例子2中,arg 也绑定到 [0] 这个列表对象上。
# 函数中的操作仍然是对 a[0] 这个对象的操作,
# 所以结果肯定是同时影响到已经绑定到 a[0] 上的所有变量的。
# 最后回到开始的问题,到底是传值还是传引用呢?其实都不是,python中可以理解为传对象。
# a = 1
#
#
# def setvalue():
# global a
# a = 100
#
#
# setvalue()
# print(a)
# 简单的解释一下,因为在第一个例子中,函数中的 a 是局部变量,作用域只在函数内,所以不影响函数外的命名空间。
# 第二个例子中,使用了 global 关键字,作用是将函数内对 a 的操作影响扩展到全局,所以函数外的结果收到了影响。
# 名字空间
# 命名空间的定义:变量到对象的映射集合。一般都是通过字典来实现的。主要可以分为三类:
# 内置命名空间
# 函数的本地命名空间
# 模块的全局命名空间
# 对于模块的全局命名空间,因为有着模块名的前缀,所以互相是没有影响的。
# 比如模块A和B都有c变量,那么通过A.c和B.c来使用是不冲突的。
# 这三种命名空间也有着自己的生存周期,
# 除了第二个函数的本地命名空间生存周期只在函数的调用开始到结束,
# 其他两个的生存周期都是可以看做持续到解释器退出的。
# 作用
#
# 命名空间的作用:程序在直接访问变量时,会在当前的命名空间内查找。
# 这里稍微拓展一下,import导入模块的本质,就是将其他模块的类、函数、变量等对象加入到程序的命名空间。
# 再谈的深一点,python 中类的继承也是通过命名空间来实现的!这个下次笔记再说。。跑偏了
#
# 作用域 就是一个 Python 程序可以直接访问命名空间的正文区域。
# 也可以理解是多种层级命名空间的叠加作用。
# 在一个python程序中,直接访问一个变量,
# 会从内到外依次访问所有的作用域直到找到,
# 否则会报未定义的错误。可以具体分为以下四个作用域:
#
# Local(innermost)
# 包含局部变量,比如一个函数/方法内部。
# Enclosing
# 包含了非局部(non-local)也非全局(non-global)的变量。
# 比如两个嵌套函数,内层函数可能搜索外层函数的namespace,但该namespace对内层函数而言既非局部也非全局。
# Global(next-to-last)
# 当前脚本的最外层,比如当前模块的全局变量。
# Built-in(outtermost)
# Python builtin 模块。包含了内建的变量/关键字等。
# 一个命名的作用域在它初次定义的时候确定,
# 如果在当前作用域找不到命名时,
# 会到外层作用域中寻找相应的命名,最后回到全局作用域和内置作用域中寻找。
# 也就是按照LEGB的顺序来寻找一个命名对应的对象。
# def test():
# b = 200
# def test2():
# b = 100
# print(b)
# test2()
# print(b)
# b = 300
# print(b)
# 函数 test2() 中访问b时,在本地作用域率先找到 b=100 这条语句,
# 所以由100这个对象起作用。在 test() 中,它的本地作用域中b的引用为200,不会去 test2() 中去搜索。
# 如果删除掉 test2() 中 b=100的语句,那么test2函数调用时,在本地作用域找不到b的引用,会向上级enclosing作用域寻找,
# 成功找到b的引用200,所以200在test2函数中生效!
# def test():
# print a
# a = 100
# a = 200
# test()
# 这个例子会报错,因为在 test() 函数中,因为本地作用域有命名a的引用操作,
# 所以 print a 会优先使用本地作用域的命名。但是定义在使用之后,所以会报错。
#
# 事实上,所有引入新命名的操作都作用于局部作用域。
#
# 官方文档这句话的意思,这里的局部作用域要以相对角度去理解
# global、nonlocal
#
# 通过 global 和 nonlocal 两个关键字,
# 可以将内层的变量引入到全局作用域。终于讲到了之前那个例子,
# 弄懂了命名空间和作用域的基础上,就能很简单的理解那个例子了。
# def scope_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)
# scope_test()
# print("In global scope:", spam)
# Globals() Locals()
# 这两个方法是关于返回作用域的函数,
# 前者返回全局作用域。后者返回当前的本地作用域。
# 用这两个函数可以帮助理解namespace和scope,直接贴上我写的一段代码:
import os
from sys import argv
class test:
pass
def test2(arg1,arg2):
print(locals())
return arg1 + arg2
def test3():
b = 2
def test4():
b = 200
return b
test4()
print(locals())
a = 1
b = 100
test2(a,b)
test3()
print(globals())
# 第一个字典记录的是test2()函数的本地作用域,可以看到只有两个参数的命名。
# 第二个字典是test3()函数的本地作用域,有一个函数对象和一个命名。
# 第三个是这个py文件的全局作用域信息,除了py文件中定义的函数、类、变量等,
# 还有一些特殊变量__name__ __doc__ 内置模块 __builtins__
# 我们引入的 os 模块也是作为一个模块对象,但是不同的是通过 form sys import argv
# 来引入的 argv 已经和原模块脱离联系,我们已经在本py文件中重新拷贝了一份
总结:
命名空间就是一个集合,变量到对象的集合,程序在访问变量的时候,在那个区域里面找,这个区域就是命名空间,可以是内置的命名空间,函数本地的空间,模块的全局空间,x=a就是在当前
的命名空间中增加x到a的映射.
学习python类的更多相关文章
- 重新学习python类
之前觉得有java和c++的底子,对python的类没有认真研习,后面到了写项目的时候各种懵逼.终于决定彻底解决python的类问题. 一.python的类定义: class cls_name: de ...
- 学习Python类的心得
类的注意事项 1)命名规则 需要注意的是,在Python中,变量名类似__xxx__的,也就是以双下划线开头,并且以双下划线结尾的, 是特殊变量,特殊变量是可以直接访问的,不是private变量, ...
- Python学习:类和实例
Python学习:类和实例 本文作者: 玄魂工作室--热热的蚂蚁 类,在学习面向对象我们可以把类当成一种规范,这个思想就我个人的体会,感觉很重要,除了封装的功能外,类作为一种规范,我们自己可以定制的规 ...
- python类学习以及mro--多继承属性查找机制
版权声明:本文为博主原创文章,未经博主允许不得转载. 还记得什么是新式类和旧式类吗? Python中,一个class继承于object,或其bases class里面任意一个继承于object,这个c ...
- 《python基础教程(第二版)》学习笔记 类和对象(第7章)
<python基础教程(第二版)>学习笔记 类和对象(第7章) 定义类class Person: def setName(self,name): self.name=n ...
- 零基础入门学习Python(36)--类和对象:给大家介绍对象
知识点 Python3 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. 如果你以前 ...
- Python 类学习的一些Tips
这里不详细介绍类,只总结一些小萌新在学习python 类时会有的一些疑点. 类的私有性 在python中,属性和方法的访问权限只有两种,公开的,和私有的.在给属性命名时用两个“__”下划线作为开头,就 ...
- python类,魔术方法等学习&&部分ssti常见操作知识点复习加深
python类学习&&部分ssti常见操作知识点复习加深 在做ssti的模块注入的时候经常觉得自己python基础的薄弱,来学习一下,其实还是要多练习多背. 在python中所有类默认 ...
- Python学习笔记之面向对象编程(三)Python类的魔术方法
python类中有一些方法前后都有两个下划线,这类函数统称为魔术方法.这些方法有特殊的用途,有的不需要我们自己定义,有的则通过一些简单的定义可以实现比较神奇的功能 我主要把它们分为三个部分,下文也是分 ...
随机推荐
- 解决 Python2 和 Python3 的共存问题
首先安装两种版本的Python 进入系统属性更改环境变量 将两个版本的安装路径找出. 添加至PATH中,变量之间用分号隔开. D:\Python36\Scripts\;D:\Python36\;D:\ ...
- R语言学习笔记(十三):零碎知识点(36-40)
36--diag() 如果它的参数是一个矩阵,它返回的是一个向量 如果它的参数是一个向量,它返回的是一个向量 如果它的参数是一个标量,它返回的是指定大小的单位矩阵 > diag(2) [,1] ...
- 笔记-python-动态添加属性
笔记-python-动态添加属性 1. 添加对象/类属性 添加对象属性 class Person(object): def __init__(self, newName, newAge): ...
- 集成activiti到现有项目中
1.在lib中添加相关的jar包 2.找到一个activiti.cfg.xml,若是想用现有的数据库需要配置 <?xml version="1.0" encoding=&qu ...
- 4 class类 web服务器
1.换行符 2.pycharm 连接Ubuntu 1)添加环境变量 2)查看ip 3)配置目录 4)上传或者下载 3.面向对象抽象web服务器 1)版本1:类 class HttpServer(obj ...
- 【jQuery】 资料
[jQuery] 资料 1. 选择器 http://www.w3school.com.cn/jquery/jquery_ref_selectors.asp 2. 事件 http://www.w3sch ...
- 云计算之路-阿里云上:原来“黑色0.1秒”发生在socket读取数据时
在昨天的博文(云计算之路-阿里云上:读取缓存时的“黑色0.1秒”)中我们犯了一个很低级的错误——把13ms算成了130ms(感谢陈硕发现这个错误!),从而对问题的原因作出了错误的推断,望大家谅解! 从 ...
- Vue一些重要的知识点
vue sync修饰(1)双向数据绑定,父子组件之间信息的交互 1⃣️在自组件中使用this.emmit('toFather'),子组件产生一个tofather事件,然后在父组件中通过@进行监听,那么 ...
- C++学习014函数值传递和地址传递
当我们给一个函数传参数的时候,可以直接值传入函数,也给可以把一个地址传入函数 区别就是一个本身不被改变,而另一本身也在改变, 在开发时候都会用到, 这里做下记录 #include <iostre ...
- 用Python 的一些用法与 JS 进行类比,看有什么相似?
Python 是一门运用很广泛的语言,自动化脚本.爬虫,甚至在深度学习领域也都有 Python 的身影.作为一名前端开发者,也了解 ES6 中的很多特性借鉴自 Python (比如默认参数.解构赋值. ...