[英]python function calling within a class
我这里有一个有趣的要求。 假设我有一个名为Object的类,它具有两个方法func1()和func2()。 第二种方法调用func1(),尽管我希望能够更改func1()的函数定义,从而能够区分在func2()内部被调用与作为我的Object类的独立方法被调用之间的区别,像这样:
obj = Object()
obj.func1()
我可以简单地创建函数的两个版本(一个私有方法供func2()使用,一个公共方法供用户访问;是的,我知道在python中确实没有私有的东西,但是遵循我认为的常规命名约定,我可以明确指出它仅是内部函数)。 但这将需要相当多的冗余,这是我想尽可能避免的事情。 有没有人可以推荐任何机制或策略来做这种事情?
例如,我知道,如果我希望我的整个脚本object.py在仅作为独立脚本运行时执行一组代码(即-不会在另一个脚本的顶部导入),我会这样做:
if __name__ == "__main__":
...
code to run if standalone
...
我想知道类的方法是否有类似的策略。
您也可以像这样使用inspect
:
import inspect
def func2():
if inspect.stack()[1][3] == "func1":
#...do something...
else:
#...do something else...
def func1():
return func2()
有关详细信息,请参见官方文档:
您可以使用sys._getframe()
并根据调用者决定要做什么。 f_code.co_name
返回函数
import sys
class MyClass(object):
def func1(self):
frame = sys._getframe(1)
if frame.f_code.co_name == 'func2':
print "called from func2"
else:
print "called from elsewhere"
def func2(self):
self.func1()
c = MyClass()
c.func1()
c.func2()
通过阅读您的评论,看来您的实际问题是这样的:您有一种打印一些输出的方法。 如果用户调用该代码,则您希望将该输出打印到终端。 如果代码是通过另一种方法在内部调用的,则您不希望输出输出。
@mgilson建议的debug
参数是一个不错的选择,但是无论出于何种原因,您都希望用户不知道该选项。
另一种方法是使函数包装器在函数调用期间重定向stdout
,然后再将其还原。 像这样:
import os
import sys
def suppress_print(f, *args, **kwargs):
"""Call the function f, but print to the null device
instead of the screen."""
old_stdout = sys.stdout
sys.stdout = open(os.devnull, 'w')
result = f(*args, **kwargs)
sys.stdout = old_stdout
return result
class Foo:
def bar(self):
print "This is a test."
return 42
def baz(self):
return suppress_print(self.bar)
foo = Foo()
# this should print to the terminal
foo.bar()
# this shouldn't
foo.baz()
然后,当你在内部调用的函数,你把它包suppress_print
,输出会被压扁。 请注意,这实际上是使用上下文管理器的好地方,但我将其留作进一步练习...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.