Python:"遥远"之间的沟通同一个调用链上的类

时间:2015-07-20 14:22:17

标签: python class

我有start.py

# start.py

class Start:
    def __init__(self):
        self.mylist = []

    def run(self):
        # some code

执行其run()方法会在某个时候调用put_item(obj)中的moduleX.py方法:

# moduleX.py

def put_item(obj):
    # what should I write here

run()不是put_item(obj)的直接来电者。实际上,从run()put_item(obj),执行非常复杂,并涉及许多其他调用。

我的问题是,在调用put_item(obj)时,我可以直接将obj的值添加回课程mylist中的Start吗?例如:

s = Start()
# suppose during this execution, put_item(obj) has been 
# invoked 3 times, with obj equals to 1, 2, 3 each time
s.run() 
print(s.mylist) # I want it to be [1,2,3]

更新

  1. run()put_item(obj),执行涉及到我无法控制的第三方模块和函数调用的大量使用。换句话说,run()put_item(obj)之间的执行对我来说就像是一个黑盒子,而这个执行会导致我感兴趣的obj的价值。

  2. objput_item(obj) moduleX.py中使用,put_item(obj)也是第三方模块。 obj最初具有以奇特的方式显示obj的GUI代码。但是,我想修改其原始行为,以便我可以在mylist课程中将Start添加到mylist,然后以我自己的方式使用Start

    < / LI>
  3. 因此,我无法将put_item引用沿着调用链传递给moduleX.py,因为我不知道调用链,我根本无法修改它。此外,我无法更改put_item(obj)中的方法签名,否则我将破坏原始API。我可以更改的内容是start.py<form role="form" class="ng-pristine ng-valid" name="registerForm"> <fieldset> <div class="form-group"> <input class="form-control" placeholder="First Name" name="firstname" type="text" autofocus="" required ng-class="{'has-error': registerForm.firstname.$invalid}"> </div> <div class="form-group"> <input class="form-control" placeholder="Last Name" name="lastname" type="text" value=""> </div> <div class="form-group"> <input class="form-control" placeholder="E-Mail" name="email" type="email" value="" ng-class="{'has-error': registerForm.email.$dirty}"> <div ng-show="registerForm.email.$dirty">Email Invalid</div> </div> <div class="form-group"> <input class="form-control" placeholder="Password" name="password" type="password" value="" autocomplete="off"> </div> <div class="form-group"> <input class="form-control" placeholder="Organization Name" name="organizationName" type="text" value=""> </div> <div class="form-group"> <select data-ng-options="item.Display for item in OrganizationTypes track by item.Value" data-ng-model="SelectOrganizationType" class="form-control"> <option value="">-Select Organization Type-</option> </select> </div> <input type="button" value="Register" class="btn btn-lg btn-success btn-block" data-ng-click="Submit()" name="btnSubmit"/> </fieldset> </form>

  4. 的内容

2 个答案:

答案 0 :(得分:0)

只需让put_item返回您要放入实例的项目:

def put_item():
    # some code
    return 42

class Start:
    def __init__(self):
        self.mylist = []

    def run(self):
        # some code
        self.mylist.append(put_item())

s = Start()
s.run()
print(s.mylist)

打印:

[42]

答案 1 :(得分:0)

是的,您可以,但是您必须将对Start对象列表的引用传播到调用堆栈中put_item()。然后,您的Start对象可以将项添加到列表中。它不必知道或关心它传递的对象是否在Start中。它可以盲目地添加它们。

例如(Ideone):

class Start:
    def __init__(self):
        self.mylist = []

    def run(self):
        foo(self.mylist)
        print(self.mylist)

def foo(listRef):
    bar(listRef)

def bar(listRef):
    someItem = "Hello, World!"
    put_item(listRef, someItem)

def put_item(listRef, obj):
    listRef.append(obj)

x = Start()
x.run()

当然,如果你传递给foo的东西不是一个列表,你就会得到适当的运行时错误。