【问题标题】:Call Python object's variable as a function without passing the calling object在不传递调用对象的情况下将 Python 对象的变量作为函数调用
【发布时间】:2015-04-11 17:50:31
【问题描述】:

我有一个类似这样的结构:

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

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

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

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

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

【问题讨论】:

  • 为什么不只是def foo(self): foobar()?
  • @Huey 因为在这种特殊情况下,它不是我可以定义的。它是一个外部方法,将被子类中的另一个外部方法覆盖。
  • 尝试使用classmethod。

标签: python python-2.7 static-methods


【解决方案1】:

Decorators are plain functions,你应该可以在类定义中显式调用staticmethod(foobar)

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

【讨论】:

    【解决方案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
    

    【讨论】:

    • 我认为用第二个函数运行该函数是不够的。我不得不对我给出的最简单组件的示例进行大幅删减,但其中也有一些 yield 声明 - 不确定这会如何影响它们。
    • 好吧,虽然很感激(并且期望)您将示例归结为相关部分,但请确保所有与相关的内容(与您/您的问题或疑问) ) 仍然包括在内。 Einstein's razor 和奥卡姆的一样重要。
    • @Z̷͙̗̻͖̣̹͉̫̬̪̖̤͆ͤ̓ͫͭ̀̐͜͞ͅͅαлγo:它应该工作得很好。 foobar 是一个生成器函数,foo 不是,但 foo 应该返回由 foobar 返回的生成器迭代器,就好像 foo 是一个生成器函数本身一样。
    猜你喜欢
    • 2011-12-13
    • 1970-01-01
    • 2020-09-23
    • 1970-01-01
    • 1970-01-01
    • 2017-04-10
    • 2014-08-04
    • 1970-01-01
    • 2012-05-24
    相关资源
    最近更新 更多