如何在类及其方法中使用 self 参数、@staticmethod 关键字

Posted

技术标签:

【中文标题】如何在类及其方法中使用 self 参数、@staticmethod 关键字【英文标题】:How to use self parameter, @staticmethod keyword inside a class and its methods 【发布时间】:2017-10-30 15:57:56 【问题描述】:

我有一个具有多种方法的 python 类。我已经通过@staticmethod 实例定义了我的方法,我想从我的主函数(main_function)内部调用我的类的其他方法。我想我需要self 参数来从我的主函数调用我的其他函数,并且我想在创建我的类的实例时将此参数传递给我的main_function

class myclass:
  @staticmethod
  def function1(param1)
      print "function1"
  @staticmethod
  def main_function(self, param1)
     function1(param1)

my_object = myclass()
my_object.main_function(param1)

我收到了这个错误:

TypeError: main_function() takes exactly 2 arguments (1 given)

问题是我在创建实例时没有self 参数。我试图从我的方法定义中删除 @staticmethod 关键字并删除所有使用的 self 参数,但这不起作用。

【问题讨论】:

那你为什么要使用一个类呢?不要使用类作为命名空间,使用模块。 是的,这就是模块的用途 类用于创建捆绑数据和功能的自定义对象。如果您没有 state,请不要使用类。 静态方法正是采用self的方法,因为它不需要调用其他实例方法,或者会这样做通过类名。 @Stateless:到目前为止,您还没有说明任何原因,所以我们无法为您提供帮助。不用你推理,我将仅依靠我 20 年的 Python 开发经验,告诉你应该使用模块,而不是类。 【参考方案1】:

仅当您正在创建一个通常希望与特定类绑定但不需要任何其他上下文的函数时,才使用@staticmethod。例如,str.maketrans() function 是一个静态方法,因为它是您在处理字符串时经常使用的实用程序函数,将其命名为已经存在的 str 类型(作为一个类预先存在)在那里是有意义的.

您似乎正在使用类作为 命名空间。不要那样做。为您的函数使用模块,您不必担心适用于类的特殊范围规则。仅当您需要将 statefunctionality 捆绑在一起时才使用类。

如果您坚持使用具有静态方法的类无论如何,那么您将无法在任何地方对类名进行硬编码:

class myclass:
    @staticmethod
    def function1(param1)
        print "function1"

    @staticmethod
    def main_function(param1)
        # Want to use other functions in this class? Then you will
        # have to use the full name of the class as a prefix:
        myclass.function1(param1)

您可以改用 classmethods,这样您就有了对类对象的引用:

class myclass:
    @staticmethod
    def function1(param1)
        print "function1"

    @classmethod
    def main_function(cls, param1)
        # Now you can use the `cls` reference to access other attributes
        cls.function1(param1)

这有一个额外的优势,您可以使用继承。

但是,使用模块是将一组函数组织到命名空间中的正确方法。将所有内容放入包中的my_module.py 文件中,然后使用导入;

import my_module

my_module.main_function(param1)

现在 my_module 中的所有全局变量都捆绑到一个模块对象中,不需要前缀或 cls 引用。

【讨论】:

@Martijin,这是一个很好的答案。这对我帮助很大,我通过这个理解了静态方法和模块。谢谢。

以上是关于如何在类及其方法中使用 self 参数、@staticmethod 关键字的主要内容,如果未能解决你的问题,请参考以下文章

python中特殊参数self的作用

在 Python 中进行多处理时,在类实例中通过 self 传递参数

类属性与方法(待补充)

python类(class)中参数self的解释说明

python中的self

如何在类中装饰方法?