- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个 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/
我是一名优秀的程序员,十分优秀!