我有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]
更新:
从run()
到put_item(obj)
,执行涉及到我无法控制的第三方模块和函数调用的大量使用。换句话说,run()
到put_item(obj)
之间的执行对我来说就像是一个黑盒子,而这个执行会导致我感兴趣的obj
的价值。
obj
在put_item(obj)
moduleX.py
中使用,put_item(obj)
也是第三方模块。 obj
最初具有以奇特的方式显示obj
的GUI代码。但是,我想修改其原始行为,以便我可以在mylist
课程中将Start
添加到mylist
,然后以我自己的方式使用Start
。
因此,我无法将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>
。
答案 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的东西不是一个列表,你就会得到适当的运行时错误。