方法2中的中断方法1,在方法1 python中调用

时间:2013-10-03 07:43:54

标签: python methods class-method

首先,我应该说我不知道​​这个话题是否足够好,但在一行中解释我的问题真的很难。

之后,我会向你解释整个事件;

我正在python中编写一个程序,其中我有一个带有一些方法的类和一个这样的方法(method1),在一个循环中运行配置数据列表的另一个方法(method2)和方法2我打电话给班上的其他一些方法。代码是这样的:

class myClass():
    def method1(self):
        for member in some_list:
            method2(member)

    def method2(self, member):
        do something with the member
        self.method3()
        self.method4()
        self.method5()
        ...

在method2中,有些情况我想从内部方法中停止method2。我的意思是有时候我想在方法3或方法4中停止方法2。

我不想使用assert,因为它会停止整个程序,我只想跳过这个特殊成员并继续在method1中循环。换句话说,列表中的某些成员会在某些情况下无法继续使用method2,我们应该停在那里并为列表的下一个成员启动method2的过程。

我现在可以返回True和False值并检查它以决定是否要使用return关键字停止,但我不想使用此方法。我真正想要的是编写一个方法,在这些情况下,我调用它,方法停止method2执行并返回到method1中的第一个循环以选择另一个成员。我可以写一个例子:

def method3(self):
    do something 
    if some_special_situation:
        method_stop()
    else:
        continue execution

def method_stop():
    do something to stop the method which is calling it
    and the method that the first method is called there
    I mean if method2 is calling method3 and method3 is calling method_stop
    method_stop should stop both method2 and method3

我不知道这个问题有多清楚,但如果你想要任何解释,请问我。 我将不胜感激。

3 个答案:

答案 0 :(得分:1)

如果method1以外的方法是私有的(否则外部调用者必须处理异常),使用异常将是最简单的方法:

class MyClass():
    class ContinueException(Exception):
        pass

    def method1(self, members):
        for member in members:
            try:
                print "in method1 with ", member
                self.method2(member)
            except MyClass.ContinueException:
                pass

    def method2(self, member):
        print "->in method2 with ", member
        self.method3(member)
        self.method4(member)

    def method3(self, member):
        print "--->in method3 with ", member
        if member % 2 == 0:
            raise MyClass.ContinueException()

    def method4(self, member):
        print "----->in method4 with ", member

member为偶数时,method3会引发异常,因此不会调用method4

>>> c = MyClass()
>>> c.method1([1,2,3,4])
in method1 with  1
->in method2 with  1
--->in method3 with  1
----->in method4 with  1
in method1 with  2
->in method2 with  2
--->in method3 with  2
in method1 with  3
->in method2 with  3
--->in method3 with  3
----->in method4 with  3
in method1 with  4
->in method2 with  4
--->in method3 with  4
>>>

答案 1 :(得分:0)

method1():
    method_names = ["method1","method2",...]
    for name in method_names:
        if !getattr(self, name)():
            return False
    #more code

method2():
    #epic code goes here
    if bad_stuff_happens:
        return False
    #epic code goes here
    return True

答案 2 :(得分:0)

抛出异常,然后在method1中捕获它。哪个BTW是assert所做的,它会抛出AssertionError,你可以捕捉到它。它只是在程序一直到解释器时结束程序。