python __init__类属性,什么时候类Test会准备好吗?

时间:2017-09-29 14:20:39

标签: python init

本书流利的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)

3 个答案:

答案 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.aa也会有效。

答案 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)