Python 在函数内部和函数外部定义变量有什么区别
我想学习Python中类的基础知识,但我被卡住了。我声明了类变量和实例变量的相同名称,以便更好地理解它们之间的区别,但当我在类方法中使用类变量时,它会显示类似于NameError的错误:未定义全局名称“a”。如果类变量和实例变量具有相同的名称,有人能告诉我如何在类内外声明类变量吗。下面给出了代码,因此输出中存在错误Python 在函数内部和函数外部定义变量有什么区别,python,class,oop,global-variables,Python,Class,Oop,Global Variables,我想学习Python中类的基础知识,但我被卡住了。我声明了类变量和实例变量的相同名称,以便更好地理解它们之间的区别,但当我在类方法中使用类变量时,它会显示类似于NameError的错误:未定义全局名称“a”。如果类变量和实例变量具有相同的名称,有人能告诉我如何在类内外声明类变量吗。下面给出了代码,因此输出中存在错误 class abc: a=10 def __init__(self,a): self.a=a def mod1(self):
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
20
20
回溯(最近一次呼叫最后一次):
文件“/Users/rituagrawal/PycharmProjects/untitled2/code/garbage.py”,第18行,在
b、 读()
文件“/Users/rituagrawal/PycharmProjects/untitled2/code/garbage.py”,第14行,已读
印刷品(a)
NameError:未定义全局名称“a”
进程已完成,退出代码为1
在类级别设置的属性由类的每个实例共享
在\uuuu init\uuuu
或其他方法(例如self.a=a
)中对实例设置的属性对于每个实例都不同,并且在每个方法中都可用
也可以在方法中设置引用-a=15
,这些引用仅在方法的范围内<在read()
方法中,code>print(a)失败,因为该方法中未设置a
更新:
一些代码来说明
class-MyClass:
a=10
定义初始化(self,b):
self.b=b
def读取(自):
c=99
print(self.a)#Class属性-对于MyClass的所有实例都相同
print(self.b)#Instance属性-MyClass的每个实例都有自己的实例,在所有方法中都可用
打印(c)#本地-仅在此方法中可用。
欢迎来到苏丽图·阿格拉瓦尔
self.a
是一个实例变量,正如您所理解的。如果要引用静态(类)变量a,则应使用:
abc.a
因此:
您还可以使用实例的_类_成员,因此:
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\u object.a
作为实例变量和ClassName.a
作为类变量直接访问类外的两个变量
print(b.a)
#30
print(abc.a)
#60
可能重复的检查我的答案下面,看看它是否有助于你!谢谢,但是解释器不可能在函数Read()中考虑一个AS类变量。我将添加一些代码以使所有这些更清楚。谢谢。我现在知道了,谢谢你的回复。如果我声明abc,你能详细说明“a”中的哪一个正在改变吗?a=40,因为这个程序的输出是20,40,如果我使用abc,我仍然不知道哪个变量正在改变类变量或实例变量。a=40因为abc是类,abc.a=40将类变量改变为40。由于b是一个实例,因此b.a=50将实例变量更改为50。
print(b.a)
#30
print(abc.a)
#60