如何在Python中访问父类的实例变量?

3

我想要访问在父类构造函数中定义的类变量。以下是代码。

class A(object):
    def __init__(self):
        x = 0

class B(A):
    def __init__(self):
        super(B, self).__init__()

    def func(self):
        print self.x

s = B()
s.func()

这个给我报错:

AttributeError: 'B' object has no attribute 'x'

如果我试图将func()改为
def func(self):
    print x

然后我遇到了错误:
NameError: global name 'x' is not defined

如果我试图将func()更改为
def func(self):
    print A.x

然后我遇到了错误

AttributeError: type object 'A' has no attribute 'x'

现在我没有更多的想法了..在父类A中正确访问那个类变量x的方法是什么?谢谢!

注意:我只在我的项目中工作于“B类”部分,因此我无法修改A类并改变变量定义的方式。这是唯一的限制。


2
x 不是一个类变量。 - Daniel Roseman
1
你似乎混淆了局部变量、实例变量和类变量。 - Martijn Pieters
2个回答

4

必须是self.x,而不仅仅是x

class A(object):
    def __init__(self):
        self.x = 0

简单说明一下-即使使用其他方法,A中的x也是不可访问的:

class A(object):
    def __init__(self):
        x = 0
    def foo(self):
        print(self.x) # <- will not work
        print(x) # <- will utimately not work

1
你需要将其设置为self.x = 0而不是x = 0 - 否则它只是一个局部变量。
如果你无法修改A,那么你试图做的是不可能的 - 绝对没有办法访问该值,即使使用黑魔法也不行(如果你的方法被该方法调用,你可能可以通过堆栈做一些恶心的事情来获取它的值)。

1
请查看我问题底部的注释。 - return 0
在这种情况下,您试图做的是不可能的。 - ThiefMaster
2
据我所知,即使是最黑暗的黑色 Python 魔法,也不能让你从函数中访问局部变量,除非它在你的调用堆栈中(这里并非如此)。 - ThiefMaster
我认为一些黑魔法,包含调试器并从本地命名空间中窃取值可能会实现它,但这不是应该采取的方式。 - Messa
但是在方法执行后,他无法再这样做 - 它会消失。也许你可以从垃圾回收器中获取它,但如果它只是一个整数,他无法知道它是否是他正在寻找的值(对于函数来说,这将非常容易)。 - ThiefMaster
但是 A.__init__ 是从 B.__init__ 调用的,所以有一些空间可以设置一些恶意的东西 :) - Messa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接