代码大致如下,其中 parent class 是某个开源库类
# parent class
class A(object):
# ... bala bala ...
def test(self, url):
# ... bala bala ...
rsp = self.http.send(url=url)
rsp = json.loads(rsp.content)
self._session = self._session_type(rsp['a'], rsp['b'])
# subclass
class B(A):
def test(self, url):
# ... bala bala ...
rsp = self.http.send(url=url)
rsp = json.loads(rsp.content)
self._session = self._session_type(rsp['a'], rsp['b'])
self._xx = rsp['xx']
如果 A.test 有将 rsp 返回的话,那 subclass 就只需要
class B(A):
def test(self, url):
rsp = super(self.__class__, self).test(url)
self._xx = rsp['xx']
所以...是否有办法可以让 parent class 的 test 方法返回 rsp 呢?(排除修改 parent class 源码的方法)
2楼 的方法测试可行,实际代码片段测试,tracert 的覆盖方法会比复制父类代码的覆盖方法慢上9~10倍(timerit repeat number = 100000)
import sys
# parent class
class A(object):
# ... bala bala ...
def test(self, url):
# ... bala bala ...
rsp = self.http.send(url=url)
rsp = json.loads(rsp.content)
self._session = self._session_type(rsp['a'], rsp['b'])
# subclass
class B(A):
def test(self, url):
_locals = {}
def tracert(frame, event, arg):
if event == 'return':
_locals.update(frame.f_locals.copy())
sys.setprofile(tracert)
try:
super(self.__class__, self).test(url)
finally:
sys.setprofile(None)
rsp = _locals['rsp']
self._xx = rsp['xx']
1
douxie 2017-06-28 23:14:07 +08:00
B 中的 test 重写一遍 A.test 的实现,不就行了么
|
2
XYxe 2017-06-28 23:14:11 +08:00 1
你的问题是在函数执行结束后获取函数内的变量,一个可行的方法:
|
3
Hzzone 2017-06-28 23:18:25 +08:00
子类覆盖父类的方法...
|
4
twistoy 2017-06-28 23:30:08 +08:00
重写一个函数,直接覆盖在 A.test 上面,似乎也可以?
|
5
fuxkcsdn OP |