Python中的类变量和成员变量
类变量
定义
在类里面定义,且不位于构造或者成员函数里面,同时没有" self. " 的前缀;或者在类外定义,用 类名.类变量名 来新增加类变量。
使用
两种使用方法: (1)类名.类变量名(如下的 Test.a) (2)类的实例对象.类变量名(如下的 T.a)
exp:
class Test:
a = 1 ### 类变量
def __init__(self):
self.member = 2
def indoor(self, people):
self.member = people T = Test()
print(Test.a) ## 使用方法(1)
print(T.a) ## 使用方法(2) >> 1
>> 1作用范围
类变量可以通过 使用方法(1)进行全局的修改(如操作1所示)
类变量通过 使用方法(2)只能进行局部的修改(如操作2所示)
也就是说 刚开始Test.a 和T1.a 还有 T2.a 都是指向同一地址,Test.a的修改只是修改地址里的值,而没有修改地址,而直接修改实例化对象(如T1.a 或者 T2.a)的数值,会让其实例对象的值指向新的内存空间,并且不再受到类变量Test.a的影响
exp:
class Test:
a = 1 ### 类变量
def __init__(self):
self.member = 2
def indoor(self, people):
self.member = people T1 = Test()
T2 = Test()
print(T1.a)
print(T2.a)
print(Test.a)
>> 1
>> 1
>> 1
############ 操作1 ###########
Test.a = 1000
print(T1.a)
print(T2.a)
print(Test.a)
>> 1000
>> 1000
>> 1000
############ 操作2 ###########
T1.a = 2000
print(T1.a)
print(T2.a)
print(Test.a)
>> 2000
>> 1000
>> 1000
成员变量(实例变量)
定义
在构造函数中 使用 “self.” 作为前缀的变量;或者在类的成员函数中使用“self.” 作为前缀的变量。其中前面一种定义在初始化类的时候即类实例创建的时候就产生了,而后面的定义只有当类的实例对象调用该成员函数时才被创建。
使用
在类实例化时或者在类实例调用包含有成员变量的函数时,需要给成员变量赋值。同时成员变量的使用只能使用 实例对象.成员变量名的形式(如 T.member; T.title),而不能使用类名来调用。
exp:
class Test:
a = 1
def __init__(self):
self.member = 2 ### 构造函数中的成员变量
def indoor(self):
self.title = 3 ### 成员函数中的成员变量 T = Test()
print(T.member) ## 成员变量的调用
T.indoor() ## 先调用含有成员变量的函数
print(T.title) ## 成员变量的调用 >> 2
>> 3
作用范围
成员变量在不同的类实例对象之间不是全局的。对于一个类实例对象,其成员变量可以修改。也就说,一个类实例对象拥有一块存储区域用来存放成员变量,且成员变量的值可以修改,各个类实例对象的存储区不重叠且不互通。
exp:
class Test:
a = 1
def __init__(self):
self.member = 2
def indoor(self):
self.title = 3
T1 = Test()
T2 = Test() ### 通过不同的类实例对象对于同一个成员变量进行修改 ###
print(T1.member)
T2.member = 5
print(T1.member)
print(T2.member) ### 通过不同的类实例对象对于同一个成员变量进行修改 ###
T1.indoor()
print(T1.title)
T2.indoor()
T2.title = 7
print(T1.title)
print(T2.title) >> 2
>> 2
>> 5
>> 3
>> 3
>> 7
局部变量
定义
在成员函数的内部定义变量,和普通的函数的局部变量概念一致
使用
和python中其他的局部变量的使用方法一致
作用范围
只作用于该函数的内部,与普通函数的局部变量的作用域一致
exp:
class Test:
a = 1
def __init__(self):
self.member = 2
def indoor(self):
total = 4 ## 局部变量;只在indoor函数内有效
self.title = 3
T = Test()
T.indoor()
print(T.total) ## 访问不到局部变量 >> Traceback (most recent call last):
File "main.py", line 10, in <module>
print(T.total)
AttributeError: Test instance has no attribute 'total'
还有一件事
class Test:
a = 1
self.b = 2 ## self.b 不能定义在最外层的 self只有在类的方法中才会有 指的是类实例对象本身 所以其算不上是成员变量还是类变量
def __init__(self):
self.member = 2
def indoor(self):
total = 4
self.title = 3
T = Test()
print(T.b)
>> Traceback (most recent call last):
File "main.py", line 1, in <module>
class Test(self,c):
NameError: name 'self' is not defined
Python中的类变量和成员变量的更多相关文章
- python中的类的成员变量以及property函数
1 python类的各种变量 1.1 全局变量 在类外定义的变量. 1.2 类变量 定义在类里面,所有的函数外面的变量.这个变量只有一份,是所有的对象共有的.在类外用“类.”来引用. 1.3 实例变量 ...
- python中的类变量、实例变量
类变量,是各个实例共享的资源,就像中央空调,只有一个,但每个房间(实例)均可享用. 实例变量,是每个实例各自分配使用的变量,每个房间(实例)都有一台空调,供自己使用. class handle(obj ...
- python中的类变量和对象变量,以及传值传引用的探究
http://www.cnblogs.com/gtarcoder/p/5005897.html http://www.cnblogs.com/mexh/p/9967811.html
- Python 类变量和成员变量
Python 类变量和成员变量 类与对象的方法 我们已经讨论了类与对象的功能部分,现在我们来看一下它的数据部分.事实上,它们只是与类和对象的名称空间 绑定 的普通变量,即这些名称只在这些类与对象的前提 ...
- python类变量与成员变量
类变量与成员变量 关注公众号"轻松学编程"了解更多. 在类中声明的变量我们称之为类变量[静态成员变量], 在__init__()函数中声明的变量并且绑定在实例上的变量我们称之为 ...
- [转]关于python中带下划线的变量和函数的意义
Python 的代码风格由 PEP 8 描述.这个文档描述了 Python 编程风格的方方面面.在遵守这个文档的条件下,不同程序员编写的 Python 代码可以保持最大程度的相似风格.这样就易于阅读, ...
- Java反射机制可以动态修改实例中final修饰的成员变量吗?
问题:Java反射机制可以动态修改实例中final修饰的成员变量吗? 回答是分两种情况的. 1. 当final修饰的成员变量在定义的时候就初始化了值,那么java反射机制就已经不能动态修改它的值了. ...
- (转载)php的类中可以不定义成员变量,直接在构造方法中使用并赋值吗?
(转载)http://s.yanghao.org/program/viewdetail.php?i=184313 php的类中可以不定义成员变量,直接在构造方法中使用并赋值吗? class block ...
- struts2 - View页面中获取Action的成员变量
struts2 - View页面中获取Action的成员变量 2016年03月02日 11:04:44 IT男青年 阅读数:1074 View页面中获取Action的成员变量 按照Struts的设 ...
随机推荐
- windows下右键新建md文件
windows下右键新建md文件 打开注册表 win键+R打开运行对话框, 输入regedit, 打开注册表编辑器. 修改注册表 在磁盘的任意位置新建一个文件, 后缀名为reg, 并写入一下内容 [H ...
- python---100以内所有素数
def get_primes(): """ 100以内的所有素数:每个数都对从2到其本身前一个数做整除, 遇到能整除就换下一个数. 如果从2到去本身前一个数都没有整除,则 ...
- ORM中choices参数(重要)、MTV于MVC模型、多对多关系三种创建方式
choices参数(重要) **使用方式
- docker将jar打包镜像文件
1.首先需要编写dockerfile文件,通过dockerfile文件将jar包打成镜像 编写dockerfile文件 # 定义父镜像 FROM java:8 # 维护者信息 MAINTAINER c ...
- Java学习day4
今天学习了String以及StringBuider 其中较为重点的除了用法以外,还有,String对象以""方式给出的字符串,只要字符序列相同(即顺序和大小写)无论在代码中重复几次 ...
- 踩了个DNS解析的坑,但我还是没想通
hello大家好,我是小楼. 最近踩了个DNS解析的小坑,虽然问题解决了,但排查过程比较曲折,最后还是有一点没有想通,整个过程分享给大家. 背景 最近负责的服务要置换机器.置换机器可能很多小伙伴不知道 ...
- Dockerfile 命令详解及最佳实践
Dockerfile 命令详解 FROM 指定基础镜像(必选) 所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制.就像我们之前运行了一个 nginx 镜像的容器,再进行修改一样,基础镜像是必须指 ...
- python基础练习题(题目 打印出杨辉三角形前十行。)
day38 --------------------------------------------------------------- 实例061:杨辉三角 题目 打印出杨辉三角形前十行. 分析: ...
- 【深入理解TcaplusDB技术】扫描数据接口说明——[List表]
摘要 实现扫描指定表格中的数据. 示例代码 同步调用参见章节:[List表]扫描数据示例代码. 异步调用参见章节:[List表]异步扫描数据示例代码. Client对象方法说明 注:如有未列出来的Cl ...
- Python小游戏——猜数字
1 print("--------------我爱鱼-----------") 2 temp = input("不妨猜一下甲鱼现在心里想的是哪个数字:") 3 ...