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

标签 python class methods arguments self

我有一个 python 类,它有多个方法。我已经通过 @staticmethod 实例定义了我的方法,我想从我的主函数 (main_function) 内部调用我的类的其他方法。我想我需要 self 参数来从我的 main 函数调用我的其他函数,并且我想在创建我的类的实例时将此参数传递给我的 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 参数,但这不起作用。

最佳答案

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

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

如果您无论如何坚持使用带有静态方法的类,您将不得不在所有地方对类名进行硬编码:

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)

您可以改用类方法,这样您就可以引用类对象:

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 引用。

关于python - 如何在类及其方法中使用自参数、@staticmethod 关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44257778/

相关文章:

python - var == False 或如果不是 var

python - Pyramid 的 add_static_view 是如何工作的?

python - 将父类(super class)实例转换为子类实例

java - 在另一个事件方法中调用一个事件方法

Python Folium Choropleth map KeyError : None

python - 如何将图例绘制到绘图 Canvas 外的多列中?

c++ - 如何更改类中的数组?

Ruby:我应该如何访问类中的实例变量?

php - Yii2/PostgreSQL - 调用未知方法:yii\db\ActiveQuery::formName()

Java 7 传递方法作为通用 SQL 死锁检查的参数