Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python变量访问_Python_Variables_Instance - Fatal编程技术网

Python变量访问

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班访问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):
        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
,其次-您将拥有更干净的代码,所有实例变量都在同一位置声明。