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
时,才定义实例属性(又称实例变量)。