学习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类中有一些方法前后都有两个下划线,这类函数统称为魔术方法.这些方法有特殊的用途,有的不需要我们自己定义,有的则通过一些简单的定义可以实现比较神奇的功能 我主要把它们分为三个部分,下文也是分 ...
随机推荐
- 多线程编程之Apue3rd_Chapter11之互斥锁_读写锁_自旋锁
学习了apue3rd的第11章,主要讲的是多线程编程.因为线程共享进程的资源比如堆和全局变量,多线程编程最重要的是,使用各种锁进行线程同步. 线程编程首先要学习的三个函数如下: #include &l ...
- Kubernetes-GC
Kubernetes集群中垃圾回收(Garbage Collection)机制由kubelet完成.kubelet定期清理不再使用的容器和镜像,每分钟进行一次容器的GC操作,每五分钟进行一次镜像的GC ...
- POJ1679(次小生成树)
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 36692 Accepted: 13368 ...
- ubuntu配置机器学习环境(三) opencv 安装
这里使用脚本安装 一些教程里使用cmake 安装,很容易出错的 使用github上的安装脚本,自动化安装 参考链接 Ubuntu $ cd Ubuntu/2.4 $ chmod +x * # 如果要安 ...
- 如何理解Java中参数传递只能传值?
以前学习C#的时候,是完全在工作岗位上学习,一些底层较为深入的道理都不是很清楚.如今学习了Java,对于Java参数传递只能传值,不能传引用(指针)感到很困惑,在C#中不是常常说把某个引用传递到函数中 ...
- hihoCoder 1175:拓扑排序二
题目链接: http://hihocoder.com/problemset/problem/1175 题目难度:一星级(简单题) 今天闲来无事,决定刷一道水题.结果发现这道水题居然把我卡了将近一个钟头 ...
- Linux-Shell脚本编程-学习-4-Shell编程-操作数字-加减乘除计算
对于任何一种编程语言都很重要的特性就是操作数字的能力,遗憾的是,对于shell脚本来说,这个过程比较麻烦,在shell脚本中有两种途径来进行数学运算操作. 1.expr 最开始的时候,shell提供了 ...
- 51单片机实现外部中断0-F
#include< reg51.h> #define uint unsigned int #define uchar unsigned char sfr P0M0 = 0x94; sfr ...
- Eureka搭建
Eureka搭建 一.Eureka基本框架搭建 pom.xml文件配置:主要是引入Eureka所依赖的jar包 <?xml version="1.0" encoding=&q ...
- Android之 GPS学习笔记
========================================GPS:全球定位系统 GPS由三部分组成:GPS卫星组成的空间部分,若干地面组成的控制站,用户手中的接收机.Androi ...