将Python对象的变量作为函数调用,而不传递调用对象

时间:2015-04-11 17:50:31

标签: python python-2.7 static-methods

我的结构是这样的:

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

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

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

我无法控制foobar的定义,我可能必须覆盖子类中foo的值。

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

2 个答案:

答案 0 :(得分:6)

Decorators are plain functions,您应该能够在类定义中明确调用staticmethod(foobar)

class SampleClass:
    foo = staticmethod(foobar)
    def printfunc(self):
        self.foo() # Prints 'FOOBAR!'

答案 1 :(得分:2)

来自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语句:

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