【问题标题】:Why class methods called on other methods, should be called with 'self'?为什么调用其他方法的类方法应该用'self'调用?
【发布时间】:2017-08-08 04:50:44
【问题描述】:

当我阅读这篇关于tkintertutorial 以了解我在Python 中使用GUI 的第一步时,我意识到在__init__ 函数内部调用了一个类函数。

我想了解一下,为什么在__init__函数内部调用类函数时必须声明self.class_function()

我在下面找到了this 问题的答案,它只是说它必须被称为self.class_function 而不是class_function,而没有提供任何关于为什么必须这样做的概念或解释:

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 

【问题讨论】:

  • 调用类函数时必须使用self。因为它有助于确定函数对特定对象的行为方式。它在继承过程中也有帮助。您可以在其中使用另一个更改或覆盖基类函数。还有关于使用静态方法的事实。您必须向静态函数提供所有实例信息,但与对象关联的私有类变量呢?你将如何将它们提供给静态函数,这将是一种肮脏的做法。
  • 您的示例不包含类方法。 parse_file 是一个实例方法。
  • 如果你愿意,你也可以这样称呼它MyClass.parse_file(self)
  • 看看docs
  • 谢谢,@AzatIbrakov。

标签: python oop self


【解决方案1】:

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

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

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

您实际上可以通过执行以下操作来调用fun() 方法:

foo = Foo()
Foo.fun(foo)

这与在课堂上执行self.fun() 相同。

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

【讨论】:

  • 还有关于私有类变量的信息不能共享给静态函数的事实。
  • @RajanChauhan 嗯?你什么意思?如果您定义_private_method,那么您可以。 Python 并没有真正的“私有方法”。
  • @juanpa.arrivillaga 我在谈论类变量不能以干净的方式与静态函数共享。为此,您必须拥有他们的访问功能。是的,在 Python 中没有什么是真正私有的。但在真正意义上,这将是一个不好的做法。如果您是代码的所有者。你有开放的边界没有墙。
【解决方案2】:

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

self.foo() 指的是类的实例方法,而不是静态方法或来自其他模块的其他方法...

这样你可以在其他语言中执行类似于 this.foo() 的操作,换句话说:self.foo() 的意思是调用该对象的 foo 方法!

【讨论】:

  • "而不是静态方法" 否 - staticmethods 也会被调用,classmethods 也会被调用。
猜你喜欢
  • 2019-11-15
  • 2017-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-11
  • 1970-01-01
相关资源
最近更新 更多