【问题标题】:how to access a python method within a class from a staticmethod within the same class如何从同一类中的静态方法访问类中的python方法
【发布时间】:2020-03-15 04:34:57
【问题描述】:

我需要从同一类中的@staticmethod 执行方法:以下代码返回错误:

NameError:未定义全局名称“self”

class Main:
    def __init__(self):
        self.start = 0

    def prints(self, message):
        print (message)

    @staticmethod
    def sendMessage(message):
        self.prints(message)

if __name__ == '__main__':
    main = Main()
    main.sendMessage('Testing to print from staticmethod')

有人可以给我一个想法,如何从 stattimemethod 访问 prints 方法。谢谢你

【问题讨论】:

标签: python methods


【解决方案1】:

您不能从静态方法访问非静态类成员。静态意味着您不需要生成类的实例。因此,您可以在没有类对象的情况下使用静态方法。如果没有对象,则永远不会生成非静态成员函数,因此您不能调用它。静态范围内不存在self

您还必须将 prints(message) 方法设为静态才能访问它

【讨论】:

  • 无论哪种方式,将prints 设为静态使其在sendMessage 方法中可用。没关系。
【解决方案2】:

如果您这样做,那么您需要在静态方法中启动类并传递您要打印的变量或其他内容。没有别的办法。

【讨论】:

    【解决方案3】:
    @staticmethod
    def sendMessage(message):
        Main.prints(None, message) # Prefixing with Main so prints can be found.
    

    当调用静态方法时,调用者不会传递自己(同样,调用者不会是类的实例)。这就是您的代码中未定义self 的原因。

    要引用打印,请使用Main.prints。要调用它,请匹配参数列表:当静态调用 prints 时,没有实例引用可以作为 self 参数传递,因此显式传递其他内容(在我的示例中为 None)强制它工作。

    这将使代码运行,但您可能会像这样混合使用静态和非静态方法。此外,在您的代码中,sendMessage 正在从一个实例中调用。静态调用它看起来像:Main.sendMessage('...')

    【讨论】:

      猜你喜欢
      • 2021-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-16
      • 1970-01-01
      • 2019-03-10
      • 2017-01-01
      • 1970-01-01
      相关资源
      最近更新 更多