我想学习Python课程的基础知识,但卡住了。我声明了类变量和实例变量的相同名称,以便我可以更好地理解差异,但是当我在类方法中使用类变量时,它显示错误,例如 NameError:未定义全局名称"a"。如果类变量和实例变量具有相同的名称,有人可以告诉我如何在类内部和外部声明类变量。下面给出了代码,因此输出错误
class abc:
a=10
def __init__(self,a):
self.a=a
def mod1(self):
global a
a=5
self.a=105
def mod2(self):
a=15
self.a=110
def read(self):
print(self.a)
print(a)
b=abc(20)
print(b.a)
b.read()
b.mod1()
b.read()
b.mod2()
b.read()
错误是
20
20
Traceback (most recent call last):
File "/Users/rituagrawal/PycharmProjects/untitled2/code/garbage.py", line 18, in <module>
b.read()
File "/Users/rituagrawal/PycharmProjects/untitled2/code/garbage.py", line 14, in read
print(a)
NameError: global name 'a' is not defined
Process finished with exit code 1
在类级别设置的属性由类的每个实例共享。
在 __init__
或其他方法(例如self.a = a
(中对实例设置的属性对于每个实例都是不同的,并且在每个方法中都可用。
也可以在方法 - a = 15
- 中设置引用,这些引用仅在方法的范围内。 read()
方法中的print(a)
失败,因为该方法中未设置a
。
更新:
一些代码来说明。
class MyClass:
a = 10
def __init__(self, b):
self.b = b
def read(self):
c = 99
print(self.a) # Class attribute - the same for all instances of MyClass
print(self.b) # Instance attribute - each instance of MyClass has it's own, available in all methods
print(c) # Local - only available in this method.
欢迎来到SO Ritu Agrawal。
self.a
是一个实例变量,正如您似乎已经推测的那样。如果你想引用静态(类(变量a,那么你应该使用:
abc.a
所以:
class abc:
a=10
def __init__(self,a):
self.a=a
abc.a = 40
b=abc(20)
print(b.a)
print(abc.a)
您还可以使用实例的 __class__ 成员,因此:
class abc:
a=10
def __init__(self,a):
self.a=a
__class__.a = 40
b=abc(20)
print(b.a)
print(b.__class__.a)
首先,我按如下方式简化了您的类。这里 a
类变量在类函数中使用 abc.a
引用。作为实例变量的a
使用 self.a
引用
class abc:
a=5
def __init__(self,a):
self.a=a
def set(self, class_a, instance_a):
abc.a=class_a
self.a=instance_a
def read(self):
print(abc.a)
print(self.a)
然后,我们首先定义类并尝试读取两个变量。类变量仍为 5,实例变量仍为 20
b=abc(20)
b.read()
#5
#20
然后,我设置类和实例变量a
并尝试读取它们。类变量更改为 30,实例变量更改为 60
b.set(30, 60)
b.read()
#30
#60
我们还可以直接访问类外的两个变量,使用 instance_object.a
用于实例变量和 ClassName.a
用于类变量。
print(b.a)
#30
print(abc.a)
#60