在不传递调用对象的情况下将 Python 对象的变量作为函数调用

Call Python object's variable as a function without passing the calling object

我有这样的结构:

def foobar():
    print('FOOBAR!')

class SampleClass:
    foo = foobar
    def printfunc(self):
        self.foo()

这不起作用,因为原始的 foobar 函数无法处理传递给它的 self -- 它不是任何 class 或对象的一部分。 Python 也不会让我添加 @staticmethod 装饰器。

我无法控制 foobar 的定义,我可能不得不在 subclasses 中覆盖 foo 的值。

如何在不传递调用它的对象的情况下调用 foo?

Decorators are plain functions,您应该能够在 class 定义

中显式调用 staticmethod(foobar)
class SampleClass:
    foo = staticmethod(foobar)
    def printfunc(self):
        self.foo() # Prints 'FOOBAR!'

user2357112 评论中的方法似乎也有效:

def foobar():
        print('FOOBAR!')

def foobaz():
        print('FooBAZ!')

class SampleClass:
        def foo(self):
                foobar()

        def printfunc(self):
                self.foo()

class DerivedClass(SampleClass):
        def foo(self):
                foobaz()

sample = SampleClass()
sample.printfunc() # FOOBAR!

derived = DerivedClass()
derived.printfunc() # FooBAZ!

如果 return 值能够通过,则您需要在所有级别上 return 声明,但是:

def foobar():
        print('FOOBAR!')
        return 'foo'

def foobaz():
        print('FooBAZ!')
        return 'baz'

class SampleClass:
        def foo(self):
                return foobar()

        def printfunc(self):
                return self.foo()

class DerivedClass(SampleClass):
        def foo(self):
                return foobaz()

sample = SampleClass()
s = sample.printfunc() # FOOBAR!
print(s) # foo

derived = DerivedClass()
d = derived.printfunc() # FooBAZ!
print(d) # baz