2017-08-08 44 views
1

当我读到这个tutorialtkinter为我在Python中的GUI第一步,我意识到在__init__函数内部调用一个类函数。为什么在__init__中调用类函数时必须声明自己?

我想了解,在__init__函数中调用类函数时,为什么要声明self.class_function()

我发现下面这个答案,这只是说,它必须调用self.class_function而不是class_functionthis问题,但不提供有关为什么必须这样做的任何概念或解释:

class MyClass(): 
    def __init__(self, filename): 
     self.filename = filename 

     self.stat1 = None 
     self.stat2 = None 
     self.stat3 = None 
     self.stat4 = None 
     self.stat5 = None 
     self.parse_file() 

    def parse_file(self): 
     #do some parsing 
     self.stat1 = result_from_parse1 
     self.stat2 = result_from_parse2 
     self.stat3 = result_from_parse3 
     self.stat4 = result_from_parse4 
     self.stat5 = result_from_parse5 
+1

你必须调用类函数时使用的自我。因为它有助于确定函数如何表现特定对象。它也有助于继承。你可以在哪里改变或重写基类函数。此外,使用静态方法的事实。你必须提供所有的实例信息给静态函数,但是关于与对象关联的私有类变量呢?你将如何将它们提供给静态函数,这将是一种肮脏的习惯。 –

+3

您的示例不包含类方法。 'parse_file'是一个实例方法。 –

+1

如果你愿意,你也可以称它为'MyClass.parse_file(self)' –

回答

3

我的理解是,您必须使用self.method_name而不是method_name调用方法的原因是因为,在底层,Python将self部分替换为方法的第一个参数。

您可以通过定义一个名为Foo类测试这个自己:

foo = Foo() 
Foo.fun(foo) 

这将是一样的表演:

class Foo: 
    def __init__(self): 
    self.fun() 
    def fun(self): 
    print("fun") 

您可以通过执行以下实际调用fun()方法self.fun()从班内。

请注意,你不能静态地访问私有字段(例如Foo._private_method(foo)

+0

另外,有关私有类变量的信息不能共享给静态函数。 –

+0

@RajanChauhan,我刚刚编辑为 – duper51

+0

@RajanChauhan呵呵?你什么意思?如果你定义了一个'_private_method',那么确定你可以。无论如何,Python并没有真正的“私有方法”。 –

1

为什么在调用__init__函数中的类函数时必须声明self.class_function()?

self.foo()指类的实例方法,而不是静态的方法或从其他模块的另一个方法......

以这种方式

你做的)其他语种的类似this.foo东西(在换句话说:self.foo()的意思是调用该对象的foo方法!

+1

“而不是静态方法”否 - 将调用staticmethod,同样,classmethods也会被调用。 –

相关问题