本书流利的Python第一个程序。我简化了程序。
class Test:
a = 15
def __init__(self):
self.att = a
t = Test()
print(t.att)
它不起作用,如果我使用
self.att = Test.a
然后它奏效了。 为什么即使在Test类中我也总是使用Test.a? 我学习了java,而且我不必这样做。
此外,还有另一个问题。
class Test:
a = 15
def __init__(self, b=Test.a):
self.att = b
t = Test()
print(t.att)
它不起作用。我在网站上搜索过。 原因是: 默认参数应该在函数定义时定义,直到被调用?
从那以后
self.att = Test.a
工作,所以函数内容将被检查有效直到被调用?
我是对的吗?
Class Test将在#1之后准备就绪,但在之前,我使用了Test.a,因为它在被调用之前没有检查函数内容。正确?
class Test:
a = 15
def __init__(self):
self.att = Test.a
#1
t = Test()
print(t.att)
答案 0 :(得分:1)
像这样的成员需要像这样访问:self.a
(即使在__init__
方法中)
class Test:
a = 15
def __init__(self):
self.att = self.a
t = Test()
print(t.att)
答案 1 :(得分:1)
我学习了java,我不必这样做。
但是如果你将Java与Python进行比较,你会注意到你必须为每个实例成员加上前缀self
,并且你实际上需要你的方法一直使用self
参数。所以你不能在这里真正期待Java行为。
但就像使用方法或实例变量一样,您也可以使用self
访问类成员:
class Test:
a = 15
def __init__(self):
self.att = self.a
在__init__
的运行时,self
将引用您的Test
类型的实例。因此,当您想要访问实例上的任何内容时,您需要在self
上执行此操作。对于类成员,其所有成员在实例上也是可见的(除非它们被实例成员隐藏),因此self.a
就像Test.a
一样工作。您也可以使用创建的实例t
尝试此操作:即使没有实例成员t.a
,a
也会有效。
答案 2 :(得分:0)
原因是__init__
在对象创建时执行;在__init__
函数范围内,没有定义a
变量。它应该如何知道你的意思是在课堂上定义的a
?
当陈述Test.a
时明确告诉python使用class属性。当您使用self.a
时,Python使用 MRO 查找过程来查找a
属性。
class Test:
a = 15
def __init__(self):
self.att = self.a
#1
t = Test()
print(t.att)