类变量:可在类的所有实例之间共享的变量

实例类对象:类的实例是调用类对象来创建的。如:par = Parent(),par就是类Parent的一个实例类对象。

实例变量(成员变量):同一个类对象可以创建多个实例类对象,类定义中有self标志的变量就是实例变量

一个例子,看下面的代码有个小问题

classMyObject(object):

x= 1

def __init__(self):

objectNum= 99

defchangeNum(self, anotherNum):

self.objectNum=anotherNumdefshowNum(self):print("self.num =", self.objectNum)

什么问题呢,看似构造函数__init__中的变量object在实例化对象的时候会自动创建并初始化为99,其实不然,这里用一个小的测试代码就可以发现问题。

obj =MyObject()

obj.showNum()

Traceback (most recent call last):

File"class.py", line 24, in obj.showNum()

File"class.py", line 20, inshowNumprint("self.num =", self.objectNum)

AttributeError:'MyObject' object has no attribute 'objectNum'

报错了,提示实例化对象MyObject并没有objectNum这个普通成员变量,为什么呢?

问题就在于,在Python中,类的成员变量必须使用self.propertName进行声明,这样才能完成创建,因为self的含义就是代表实例对象;

在这个类中,objectNum和self.objectNum就是两个完全不同的东西:

定义在__init__函数中的变量objectNum在这里是一个局部变量,不是类变量

接下来我们可以再写一段代码,调用changNum()方法,来生成这个成员变量self.objectNum:

obj =MyObject()

obj.changeNum(10)

obj.showNum()>>> self.num = 10

能看到成功返回结果,

由于在changeNum()方法中,有self.objectNum = anotherNum的赋值,而__init__中,没有创建类普通成员变量self.objectNum, 而是创建了一个临时变量objectNum,所以在这里,虽然changeNum()没有被自动调用(因为不是__init__()函数),但是其实充当了创建类成员变量和初始化的作用, 但是python并不会在创建新的实例化对象的时候自动调用它。

所以通过实验得到3个结论:

1.python中的"构造函数"非常的自由,如果不考虑自动调用,任何类方法都可以去创建类成员变量:

classExampleClass:defcreateObjectProperty(self, value):

self.newObjectProperty= value

如上面的代码,这里声明一个类方法,传入参数self 和 value,调用这个方法,就可以生成一个普通成员变量newObjectProperty,并对其赋初值value

2.如果想要找到真正意义上的成员变量,那么只需要在__init__(self)中声明self.objectProperty即可

3.python中的self不能隐式调用,如果你不想生成一个临时变量而是创建一个类成员变量,那么就应该使用self.variableName

classMyObject(object):

x= 1

def __init__(self):

self.objectNum= 99

defchangeNum(self, anotherNum):

self.objectNum=anotherNumdefshowNum(self):print("self.num =", self.objectNum)

obj = MyObject()

# obj.changeNum(10)

obj.showNum()

>>>self.num = 99

知道了成员变量的问题之后,再来讨论一下类变量

classMyObject(object):

x= 1

def __init__(self):

self.objectNum= 99

defchangeNum(self, anotherNum):

self.objectNum=anotherNumdefshowNum(self):print("self.num =", self.objectNum)

obj=MyObject()print(MyObject.x)>>> 1

在声明类T的时候,我们在所有的方法之外(但是仍在类的作用域中声明了一个变量classNum),从命名的角度来看,我们希望这是一个类变量,但我们不希望这次又是一个成员变量,测试发现它确实可以由类名直接访问再试一下能否修改:

MyObject.x = 100

print(MyObject.x)>>> 100

发现可以修改

下面我们验证一下其是否能被所有实例化对象访问和修改,并且是否具有全局性。

t1 =MyObject()print(t1.x)>>> 1t2=MyObject()print(t2.x)>>> 1MyObject.x= 1000

print(t1.x)>>> 1000

print(t2.x)>>> 1000t1.x= 2000

print(t2.x)>>>1000

print(t1.x)>>>2000

print(MyObject.x)>>>1000

从以上结果看出类名.类变量名修改其值会导致实例化对象的值全部被改变,但是用实例化对象名.类变量名修改其值,就仅仅改变自己,不会真的改变类变量的数值。

我们来检查一下内存,看一段代码:

t2 =MyObject()

t1=MyObject()print(MyObject.x ist1.x)>>>Trueprint(MyObject.x ist2.x)>>>Trueprint(t2.x ist1.x)>>>True---------------------------------------t2=MyObject()

t1=MyObject()

t2.x= 10

print(MyObject.x ist1.x)>>>Trueprint(MyObject.x ist2.x)>>>Falseprint(t2.x ist1.x)>>>False--------------------------------------t2=MyObject()

t1=MyObject()

MyObject.x= 100t2.x= 10

print(MyObject.x ist1.x)>>>Trueprint(MyObject.x ist2.x)>>>Falseprint(t2.x ist1.x)>>>False

看得出来在最开始的时候MyObject.x和实例化对象t1.x与t2.x内存是同一处的,但当直接修改了实例化对象t2.x的数值后t2.x内存的数值便与其他两个不同,所以直接修改实例化对象的数值会指向新的内存空间,并且不受类变量改变而改变。

总结:

一个类=类变量(可以没有)+构造函数(必须有,没有的话默认调用)+成员函数(自己定义,可以没有)

构造函数中定义了类的成员变量,类的成员变量一定是在构造函数中以self.开头的变量!

成员函数中可以调用成员变量和类变量!成员函数的形参在类的实例调用该函数时传递,成员函数的局部变量在该成员函数内部定义。调用成员函数和调用普通函数一样,只是成员函数由该函数对应的类调用,即需要写成xxxx.func()而不是直接使用func()!

python类定义变量_python类变量与__init__声明变量的区别相关推荐

  1. python类变量与__init__声明变量的区别

    类变量:可在类的所有实例之间共享的变量 实例类对象:类的实例是调用类对象来创建的.如:par = Parent(),par就是类Parent的一个实例类对象. 实例变量(成员变量):同一个类对象可以创 ...

  2. python类定义全局变量_python之全局变量

    http://www.cnblogs.com/phoebus0501/archive/2011/01/18/1938728.html 应该尽量避免使用全局变量, 因为: 1) 不同的模块都可以自由的访 ...

  3. python类属性初始化_Python类定义、属性、初始化和析构

    类的定义,属性和方法概念 方法中self的作用和意义 初始化( __init__ ) 和 析构方法( __del__ ) 类的定义 class 类名 实例 实例名 = 类名() 一个"实例& ...

  4. python类和对象_Python类和对象

    python类和对象 Python is an object-oriented programming language. Python Classes and Objects are the cor ...

  5. PYTHON 类定义,属性,初始化

    文章目录 PYTHON 类定义,属性,初始化 类定义 类的私有属性 类方法 类的初始化和析构 初始化 析构 PYTHON 类定义,属性,初始化 为了代码的编写方便简洁,引入了类的定义: 一般,使用 c ...

  6. python类继承实例_Python实现类继承实例

    Python是一种解释型.面向对象.动态数据类型的高级程序设计语言,本文就举一例Python类继承的实例. 实例代码如下: #! /usr/bin/python # Filename: inherit ...

  7. 【C 语言】结构体 ( 结构体类型变量初始化 | 定义变量时进行初始化 | 定义隐式结构体时声明变量并初始化 | 定义普通结构体时声明变量并初始化 )

    文章目录 一.结构体类型变量初始化 1.定义变量时进行初始化 2.定义普通结构体时声明变量并初始化 3.定义隐式结构体时声明变量并初始化 二.完整代码示例 一.结构体类型变量初始化 1.定义变量时进行 ...

  8. 【C 语言】结构体 ( 结构体类型定义 | 结构体类型别名 | 声明结构体变量的三种方法 | 栈内存中声明结构体变量 | 定义隐式结构体时声明变量 | 定义普通结构体时声明变量 )

    文章目录 一.结构体类型定义 二.结构体类型别名 三.结构体类型变量声明 1.使用结构体类型 ( 别名 ) 声明变量 2. 定义隐式结构体时声明变量 3.定义普通结构体时声明变量 二.完整代码示例 一 ...

  9. Python类定义字类变量与实例变量

    学过JAVA或C++等语言的程序员再去学Python类设计时感觉非常不适应,因为Python是在太自由了,让人无所适从,来python定义类时的变量来说,其定义方式.作用域.操作方法都与上述两种语言有 ...

最新文章

  1. 人工智能十大流行算法
  2. Echart的angularjs封装
  3. spring基础系列--JavaConfig配置
  4. 小明分享|LVGL调试日志
  5. 制作404页面的重要性
  6. Error:The supplied javaHome seems to be invalid. I cannot find the java executable
  7. Linux系统初学者指南,观点|Linux 系统调用的初学者指南
  8. 不用python爬今日头条_手把手教你从今日头条爬取你想要的任何图片
  9. IO 端口和IO 内存(原理篇)
  10. TriumphX与Metaverse NFT艺术家RisingSun签署专属合同
  11. 批量获取客户端时间偏差
  12. monkey4444勒索病毒解密方法方案成功处理复旦安全实验室
  13. 微软开源可解释机器学习框架 interpret 学习实践
  14. WIFI测试APP(华为、华三、锐捷)
  15. 简历太空白怎么办?如何写简历
  16. Latex数学公式方程格式总结
  17. 语音识别-特征提取 (一)
  18. import win32api, sys, os ImportError: DLL load failed: The specified module could not be found.
  19. 王者荣耀小游戏3.0更新完成!
  20. 解决 MUI QQ登陆功能报错“该应用非官方正版应用,请到......100044”

热门文章

  1. 拆散组合思路求解期望,方差
  2. win10 安装tensorflow-gpu
  3. tf.nn.bidirectional_dynamic_rnn()函数详解
  4. Loaded runtime CuDNN library: 7103 (compatibility version 7100) but source was compiled with 7005 ..
  5. Ubuntu 14.04安装Python3
  6. Hive环境搭建启动报错
  7. C++基础学习9:构造函数和析构函数
  8. Spark scala和java的api使用
  9. JS特效之很牛叉的轮播图
  10. 【LeetCode】168. Excel Sheet Column Title 解题小结