gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:40:59 25 4
gpt4 key购买 nike

我有一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com