Python变量访问
为什么我不能在b班访问self.a 不使用self作为变量的前缀。将使其成为一个实例变量Python变量访问,python,variables,instance,Python,Variables,Instance,为什么我不能在b班访问self.a 不使用self作为变量的前缀。将使其成为一个实例变量 感谢这是因为实例变量b不是在A的\uuu init\uuuu内启动的这是因为实例变量b不是在A的\uu init\uuu内启动的,因为您覆盖了b类上的demo方法 如果您想访问self.a请将其添加到类的方法中,或调用父类演示方法,如下所示: class A: def __init__(self): self.i = 0 def demo(self): sel
感谢这是因为实例变量
b
不是在A的\uuu init\uuuu
内启动的这是因为实例变量b
不是在A的\uu init\uuu内启动的,因为您覆盖了b类上的demo
方法
如果您想访问self.a
请将其添加到类的方法中,或调用父类演示方法,如下所示:
class A:
def __init__(self):
self.i = 0
def demo(self):
self.a=1
class B(A):
def __init__(self, j = 0):
super().__init__()
self.j = j
print(self.i)
self.demo()
def demo(self):
print(self.a)
def main():
b = B()
print(b.i)
print(b.j)
main()
因为您覆盖了B类上的demo
方法
如果您想访问self.a
请将其添加到类的方法中,或调用父类演示方法,如下所示:
class A:
def __init__(self):
self.i = 0
def demo(self):
self.a=1
class B(A):
def __init__(self, j = 0):
super().__init__()
self.j = j
print(self.i)
self.demo()
def demo(self):
print(self.a)
def main():
b = B()
print(b.i)
print(b.j)
main()
当您为这两个类都包含demo
方法时,最近定义的一个方法会屏蔽其他方法。由于在定义A
之后但在调用A
中的任何方法之前定义了B
,demo
将尝试访问从未定义过的变量。您应该在A
中调用demo
(可能在\uuuu init\uuuu
中),或者将B
中的demo
的名称更改为唯一的名称,这将允许您访问这两种方法(可能是最好的方法,因为它们做的事情不同,您希望同时使用这两种方法).当您为两个类都包含一个demo
方法时,最近定义的一个方法会屏蔽其他方法。由于在定义A
之后但在调用A
中的任何方法之前定义了B
,demo
将尝试访问从未定义过的变量。您应该调用A
中的demo
(可能在\uuu init\uuu
中),或者将B
中的demo
的名称更改为唯一的名称,这将允许您访问这两种方法(可能是最好的方法,因为它们做的事情不同,您希望同时使用这两种方法)。因为class A.demo()未执行:
A类:
def初始化(自身):
self.i=0
def演示(自我):
self.a=1
def demo(self):
super().demo()
print(self.a)
因为类A.demo()未执行:
A类:
def初始化(自身):
self.i=0
def演示(自我):
self.a=1
def demo(self):
super().demo()
print(self.a)
谢谢,变量a的作用域是实例或localIt是实例变量,因为它的引用是self.a
。请注意,在a
中调用self.demo()
不会解决这个问题,因为它仍然会得到B.demo
。如果要使用该路径,则需要显式调用A.demo(self)
。我想说使用不同的名称是一个更好的解决方案,但是代码设计得足够复杂,并且有足够多的其他设计问题,很难谈论它“应该”做什么。多亏了变量a的作用域是instance或localIt是一个实例变量,因为它的引用是self.a
。注意调用self.demo()A
中的无法解决该问题,因为它仍然会得到B.demo
。如果要使用该路径,则需要显式调用A.demo(self)
。我想说使用不同的名称是一个更好的解决方案,但代码设计得足够复杂,并且有足够多的其他设计问题,很难谈论它“应该”做什么。因为问题已经解决了,我只想指出,在几乎所有情况下,您都应该在init中声明所有实例参数,即使使用简单的self.a=None
。首先-你永远不会得到AttributeError
,其次-你会得到更干净的代码,所有实例变量都在同一个地方声明。因为问题已经解决了,我只想指出,在几乎所有情况下,你都应该在init中声明所有实例参数,即使是使用简单的self.a=None
。首先-您将永远不会得到AttributeError
,其次-您将拥有更干净的代码,所有实例变量都在同一位置声明。