Python 对基类的行为感到困惑

Python 对基类的行为感到困惑,python,Python,以下是我几个小时前提出的一个问题 我有以下代码: class A(object): def __init__(self, a): print 'A called.' self.a = a class B(A): def __init__(self, b, a): print 'B called.' x = B(1, 2) print x.a class A(object): def __init__(self, a):

以下是我几个小时前提出的一个问题

我有以下代码:

class A(object):
    def __init__(self, a):
        print 'A called.'
        self.a = a

class B(A):
    def __init__(self, b, a):
        print 'B called.'

x = B(1, 2)
print x.a
class A(object):
    def __init__(self, a):
        print 'A called.'
        self.a = a

class B(A):
    def __init__(self, b, a):
        print 'B called.'
        print a

x = B(1, 2)
这会产生错误:
AttributeError:'B'对象没有预期的属性“a”
。我可以通过调用
super(B,self)。\uuu init\uuuu(a)
来解决这个问题

但是,我有以下代码:

class A(object):
    def __init__(self, a):
        print 'A called.'
        self.a = a

class B(A):
    def __init__(self, b, a):
        print 'B called.'

x = B(1, 2)
print x.a
class A(object):
    def __init__(self, a):
        print 'A called.'
        self.a = a

class B(A):
    def __init__(self, b, a):
        print 'B called.'
        print a

x = B(1, 2)
其输出为:

B called.
2
为什么这样做有效?更重要的是,当我没有初始化基类时,它是如何工作的?另外,请注意,它不调用
A
的初始值设定项。是因为当我做一个

def\uuuu初始化(self,b,a)


我声明
b
b
的一个属性?如果是,我如何检查
b
是哪个类的属性-子类还是超类

您定义它的方式
B
没有任何属性。当您执行
打印a
时,
a
指的是
\uuuu init\uuuu
方法中的局部变量
a
,而不是任何属性


如果将
print a
替换为
print self.a
,您将得到与以前相同的错误消息。

在第二个代码中,调用
print a
有效,因为您正在打印作为参数传递给B的
\uu init\uuuu
函数的变量,而不是
self.a
变量(未初始化,因为未调用
A.\uuuu init\uuuu
)一旦你离开了C++的代码范围,你就可以访问<代码> A<代码> < /P> < P>简短的答案是:<代码>对象被创建。B的
\uuuuu init\uuuuu
函数通常负责调用A的
\uuuu init\uuuu
,但它不必-如果
A.\uuu init\uuuu
从未被调用,那么A的属性
A
就不会被添加到对象中,因此当您尝试访问它时会出现错误。

要解决此问题,您不必我需要使用

class B(A):
    def __init__(self, b, a):
        super(A, self).__init__(a)
确保将类声明为新样式对象,这是您已经在做的事情


[编辑:澄清]

那么
a
类似于类属性?你的意思是不是
super(B,self)。\uuu init\uuuu(a)
我猜:)我把
B
称为类的属性是对的还是有其他的python术语?嗯,最重要的是,“实例变量”和“实例属性”之间的区别是什么?@Jeremy:
\uuuu init\uuu
和其他函数一样,只是一个函数
b
只是该函数的一个参数。没有任何地方
b
设置为任何事物的属性。只有在执行例如
self.a=a
时,才定义实例属性(又称实例变量)。