Python 请问下这个继承父类怎么取局部变量

Time · 2021年06月25日 · 最后由 Time 回复于 2021年06月29日 · 2659 次阅读

共收到 10 条回复 时间 点赞
Time #1 · 2021年06月25日 Author

突然领悟了,先在 classA 里面加个 init 的属性值,然后在执行 fun2() 的过程中把属性值改变,然后在 fun4() 中去超类继承,然后使用父类的 init 的值就可以了。😂 不知道是不是都用这个方法呢

Time 回复

你这个方法,fun4() 能拿到的只有 init 里配置的初始值,拿不到 fun2() 里面改变后新的属性值吧。fun2() 改变的是 class A 对象里面的内部属性,而 class B 继承的是类,而非对象。

而且即使能实现,你这块设计也会导致使用时比较混乱。因为你这个属性值有可能在 class A 的任何方法里被改动,而且这个 class A 极有可能是在其它文件里的,对于 class B 的使用人员来说,这个属性值是一个难以预测的值,要合理使用还得看完 class A

建议可以考虑下,修改 class A ,提供这个属性值的 get 方法。然后 class B 通过获取 class A 实例化后的对象,来获取对象里面的属性(可以通过单例模式来保障 class A 只会有一个对象,避免存在多个对象拿错了)。而不是通过继承去获取。继承只能继承类,复用里面类相关的资料(如方法、类变量这类代码里本身就有写好的内容),但没法继承一个对象的(也就是用不了任何运行时才创建或改变的内容)。

或者可以去掉这些 class A 之类的脱敏,具体说下你这个场景是什么,这样才能更好地给合适的建议。

你这个 var 是中间变量值,要传递出去无非就是调用 fun4 的时候当作参数传进去。或者在类 A 里面加个类变量存这个 var,然后 fun4 里面拿去用。

你这个描述让人疑惑的地方是,又说 fun2 是框架源码你改不了,另一边你第一条回复又说类 A 你能改,到底哪里能改哪里不能改你自己都说不清楚。。

Time #4 · 2021年06月28日 Author
陈恒捷 回复

周五的时候试了下可以拿到相关的值,我修改的是 unittest.TestCase 类里面的 run 方法。我在想应该还是要再写个 get 函数去专门获取对应的值,但是这个 get 的函数需要一个传参,传参的值还是在 classA 里面获取到的,在 ClassB 里面仍绕不开去拿这个传参的值,还是需要在 ClassA 里面加属性值。

Time #5 · 2021年06月28日 Author
guoskyhero 回复

var 中间变量是源码给我的,也就是我上面回复贴图里面的 outcome.success,我的意思可能没表述清楚,我是指这个地方不能把当前的 outcome.success 值给 return 出来,因为这样后面源码就不会执行了。目前的话是把 outcome.success 的值用 init 里面的属性值保存,不清楚大家都是用什么方法去保存变量,然后调用的

Time 回复

额,从你的截图看,你这个代码里,self.staue 没可能是 False 。你这里逻辑是不是没贴全?

1、初始值是 True
2、后续改变值的语句 self.statue = outcome.success ,是放在了 if outcome.success 里面的,意味着这里面的 outcome.success 值如果是布尔值,那也必定是 True

所以,你在后面继承的 B 类里拿到 self.statue 是 True ,说明不了这个 True 就是第二个位置给的。

然后,也没太看懂你这里加个 self.statue 且想要被子类拿到的目的是什么,想实现什么功能?这块可以说下不?

PS:statue 是不是拼错了?状态的英文应该是 status

Time #7 · 2021年06月28日 Author
陈恒捷 回复

上面的 if outcome.success 这块一定是为 True 的,因为源码定义是为 True,会走进来

所以在这边变为 False 的情况下去把类的属性值进行更改,后续有个调用 TearDown 的函数,在用例执行结束之前我们需要写 db,如果用例执行失败/错误了那就不写 db 了,所以获取 outcome.success 是为了判断用例是否执行成功。
这块逻辑我试验了没有问题,只是不确定大家是不是都这样拿数据,还是有更好的办法
英文确实拼错了😂 尴尬

Time 回复

看来涉及到了不少 pytest 特性,这块不大熟悉,先退下了。

看看其他同学有没有什么建议把。

需求不难,但是提的问题把旁观的人都绕进去了,

class MyTest(unittest.TestCase):
    def tearDown(self):
        if hasattr(self, '_outcome'):  # Python 3.4+
            result = self.defaultTestResult()  # These two methods have no side effects
            self._feedErrorsToResult(result, self._outcome.errors)
        else:  # Python 3.2 - 3.3 or 3.0 - 3.1 and 2.7
            result = getattr(self, '_outcomeForDoCleanups', self._resultForDoCleanups)
        error = self.list2reason(result.errors)
        failure = self.list2reason(result.failures)
        ok = not error and not failure

        # Demo:   report short info immediately (not important)
        if not ok:
            typ, text = ('ERROR', error) if error else ('FAIL', failure)
            msg = [x for x in text.split('\n')[1:] if not x.startswith(' ')][0]
            print("\n%s: %s\n     %s" % (typ, self.id(), msg))

    def list2reason(self, exc_list):
        if exc_list and exc_list[-1][0] is self:
            return exc_list[-1][1]

参考https://stackoverflow.com/questions/4414234/getting-pythons-unittest-results-in-a-teardown-method
或者学习 pytest 的@pytest.mark.hookwrapper

Time #10 · 2021年06月29日 Author
陈恒捷 回复

hah, pytest 我也用,他也兼容了 unittest 的东西,更方便快捷

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册