检查方法是直接调用还是通过其他方法调用

时间:2017-03-22 15:03:17

标签: python python-2.7

我想知道我的方法是由用户直接调用还是由其他方法调用。为了减少抽象:

class myclass():
    def __init__(self, ...):
        ....

    def method1(self, ...):
        ...
        --- some if statement --
        print "Hello"
        return something

    def callmethod(self, ...):
        x = self.method1(...)
        return x*2

 myinstance = myclass(...)
 myinstance.method1(...)
 --> 'Hello'
 myinstance.callmethod(...)
 --> - 

希望我的班级明确我要做的事情:当用户调用'method1'时,将执行print语句,但如果'method1'被另一个方法调用,如'callmethod',则不应执行print语句。因此,我需要'some if statement'来检查用户是直接调用'method1'还是通过其他方法调用。谢谢你的帮助!

2 个答案:

答案 0 :(得分:3)

不,你不想这样做。

如果要根据方法的调用方式更改行为,则需要使用参数。您可以使用默认值来简化此操作,例如:

def method1(self, do_print=True):
    ...
    if do_print:
        print "Hello"
    return something

def callmethod(self, ...):
    x = self.method1(do_print=False)
    return x*2

现在,将打印myinstance.method1(),而myinstance.callmethod()则不会。

答案 1 :(得分:1)

使用python检查器实际上可以实现,例如:

import inspect

class myclass():
    def __init__(self):
        pass

    def method1(self):
        (frame, filename, line_number, function_name, lines, index) = inspect.getouterframes(inspect.currentframe())[1]
        if function_name == '<module>':
            print "Hello"
        return 2

    def callmethod(self):
        x = self.method1()
        return x*2

myinstance = myclass()
myinstance.method1()
myinstance.callmethod()

但是我同意丹尼尔的看法并不是一种优雅的方式来实现结果,因为它隐藏了一些行为。

有关详细信息,请参阅:this post