在不传递调用对象的情况下将 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
我有这样的结构:
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