繁体   English   中英

在类内调用的python函数

[英]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()

有关详细信息,请参见官方文档:

http://docs.python.org/2/library/inspect.html

您可以使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM