python类变量与__init__声明变量的区别
发布时间:2021-05-21 06:03:13 所属栏目:大数据 来源: https://www.jb51.cc
导读:类变量 :可在类的所有实例之间共享的变量 实例类对象 :类的实例是调用类对象来创建的。如:par = Parent(),par就是类Parent的一个实例类对象。 实例变量 (成员变量):同一个类对象可以创建多个实例类对象,类定义中有self标志的变量就是实例变量 ? 一个
类变量:可在类的所有实例之间共享的变量
实例类对象:类的实例是调用类对象来创建的。如:par = Parent(),par就是类Parent的一个实例类对象。
实例变量(成员变量):同一个类对象可以创建多个实例类对象,类定义中有self标志的变量就是实例变量
?
一个例子,看下面的代码有个小问题
class MyObject(object):
x = 1
def __init__(self):
objectNum = 99
def changeNum(self,anotherNum):
self.objectNum = anotherNum
showNum(self):
print("self.num = ",self.objectNum)
什么问题呢,看似构造函数__init__中的变量object在实例化对象的时候会自动创建并初始化为99,其实不然,这里用一个小的测试代码就可以发现问题。
obj = MyObject()
obj.showNum()
Traceback (most recent call last):
File class.pyin <module>
obj.showNum()
File in showNum
",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中的"构造函数"非常的自由,如果不考虑自动调用,任何类方法都可以去创建类成员变量:
ExampleClass:
createObjectProperty(self,value):
self.newObjectProperty = value
如上面的代码,这里声明一个类方法,传入参数self 和 value,调用这个方法,就可以生成一个普通成员变量newObjectProperty,并对其赋初值value
2.如果想要找到真正意义上的成员变量,那么只需要在__init__(self)中声明self.objectProperty即可
3.python中的self不能隐式调用,如果你不想生成一个临时变量而是创建一个类成员变量,那么就应该使用self.variableName
(self): self.objectNum = 99 obj = MyObject() # obj.changeNum(10) obj.showNum() >>>self.num =??99 知道了成员变量的问题之后,再来讨论一下类变量 |