
代码大致如下,其中 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 你的问题是在函数执行结束后获取函数内的变量,一个可行的方法: |
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 |