疑惑1 Class的变量混淆疑惑
经常疑惑 Class 里的变量究竟是怎么声明的,在类内部可以,在__init__中挂到 self 上也可以 这两者有什么区别呢?
python
## 在类内部定义一个变量
class example:
x1=1
e1=example()
>> e1.x1
#return 1
python
## 在self上挂一个变量
class example:
def __init__(self):
self.x2=1
e1=example()
>> e1.x2
#return 1
Answer
example.x1
是一个类变量(Class Variable),它在类的所有实例之间共享。这意味着,如果你改变了一个实例的x1
,那么所有的实例都会受到影响,因为x1
是属于类的,而不是单独的实例。example.x2
是实例变量(Instance Variables),它们是每个单独的实例所特有的。如果你改变了一个实例的x2
,那么只有这个实例会受到影响,其他的实例不会受到影响。
示例代码
下面是一个示例代码,展示了 Python 类变量和实例变量的区别:
python
class MyClass:
# 类变量
class_var = 0
# 实例变量
def __init__(self, instance_var):
self.instance_var = instance_var
# 创建实例1
instance1 = MyClass(10)
print(instance1.instance_var) # 输出:10
print(MyClass.class_var) # 输出:0
# 创建实例2
instance2 = MyClass(20)
print(instance2.instance_var) # 输出:20
print(MyClass.class_var) # 输出:0
# 修改实例1的实例变量
instance1.instance_var = 30
print(instance1.instance_var) # 输出:30
print(instance2.instance_var) # 输出:20
# 修改类变量
MyClass.class_var = 100
print(instance1.class_var) # 输出:100
print(instance2.class_var) # 输出:100
在这个示例中,我们定义了一个名为 MyClass
的类,其中包含一个类变量 class_var
和一个实例变量 instance_var
。我们创建了两个实例 instance1
和 instance2
,并分别给它们的实例变量赋值。然后,我们分别打印了这两个实例的实例变量和类变量。
我们可以看到,类变量的值在整个类中是共享的,无论是在哪个实例中修改它,都会影响到所有的实例。而实例变量是每个实例特有的,修改一个实例的实例变量并不会影响到其他的实例。
恍然大悟,其实为了尽量隔离每个实例的变量,我们经常用的还是self的方式声明类和对象内部的变量。若想保持一个公共的变量,可以使用类变量。并且 self 代表的意思也是实例的意思,__init__中的第一个参数是一个类的实例。