gpt4 book ai didi

Python:同名的常规方法和静态方法

转载 作者:太空狗 更新时间:2023-10-29 17:53:55 30 4
gpt4 key购买 nike

简介

我有一个 Python 类,其中包含许多方法。我希望其中一个方法有一个静态对应物——即具有相同名称的静态方法——它可以处理更多参数。经过一些搜索,我发现我可以使用 @staticmethod 装饰器来创建一个静态方法。

问题

为方便起见,我创建了一个简化的测试用例来重现该问题:

class myclass:

@staticmethod
def foo():
return 'static method'

def foo(self):
return 'public method'

obj = myclass()
print(obj.foo())
print(myclass.foo())

我希望上面的代码将打印以下内容:

public method
static method

但是,代码会打印以下内容:

public method
Traceback (most recent call last):
File "sandbox.py", line 14, in <module>
print(myclass.foo())
TypeError: foo() missing 1 required positional argument: 'self'

据此,我只能假设调用 myclass.foo() 会尝试调用它的不带参数的非静态对象(这不会起作用,因为非静态方法总是接受参数 self )。这种行为让我感到困惑,因为我希望对静态方法的任何调用实际上调用静态方法。

我已经在 Python 2.7 3.3 中测试了这个问题,只是收到了同样的错误。

问题

为什么会发生这种情况,我可以做些什么来修复我的代码以便打印:

public method
static method

如我所料?

最佳答案

虽然严格来说不可能做到,正如正确指出的那样,您始终可以通过重新定义实例化方法来“伪造”它,如下所示:

class YourClass(object):

def __init__(self):
self.foo = self._instance_foo

@staticmethod
def foo():
print "Static!"

def _instance_foo(self):
print "Instance!"

这会产生预期的结果:

>>> YourClass.foo()
Static!
>>> your_instance = YourClass()
>>> your_instance.foo()
Instance!

关于Python:同名的常规方法和静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20533349/

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