Python 关于 python 成员变量

cheunghr · 2019年08月14日 · 最后由 cheunghr 回复于 2019年08月15日 · 2107 次阅读
class Cls:
    def setUp(self):
        self.name = 'sunxiaochuan'

    def test_print(self):
        print(self.name)


if __name__ == '__main__':
    c = Cls()
    c.test_print() #AttributeError: 'Cls' object has no attribute 'name'
import unittest


class Cls(unittest.TestCase):
    def setUp(self):
        self.name = 'sunxiaochuan'

    def test_print(self):
        print(self.name)


if __name__ == '__main__':
    unittest.main()#sunxiaochuan
最佳回复

第二个里面的 setUp 方法类似于init() 方法,继承自 unittest.TestCase 的类,会先执行 setUp(),在执行测试方法。如果是普通的类,你把 setUp 改成init也能达到这样的效果。

共收到 11 条回复 时间 点赞

想请教下为何继承自 unittest.TestCase 的 test_print 方法能打印出 self.name 属性,但是普通的类却不行😅

是不是 python 中成员变量只支持在init方法中初始化,如果在方法外部声明的应该是类变量了。。。

没调 setup 哪儿来的 name
unittest 是帮你自动调了 setup

在执行c = Cls()时候只会调用__init__()方法。你的第一个例子调用test_print()时候,Setup()方法还未执行,故没有 name 属性;而第二个例子你调用的函数会先执行Setup()方法,故可以访问到 name 属性

unittest 继承此类 会先执行 setUp,所以有 name 变量。
未继承 unittest 的普通类,不会自动调用 setup 方法,所以是未定义该变量。

打个断点试试,然后一目了然😀

你把 1 的执行方式放到 2 中,一样会报 AttributeError 的错。1 的执行方式是 python test.py,2 的执行方式是 python -m unittest test.py,所以 2 会自动调用 setup,而 1 只会按照正常的 python 类来执行。

只能告诉你,就是这么设计的;
我唯一记住高中化学老师说的话就是 ,现在教给你们的好多东西是错的,但是只能这么让你们这么消化;
老师说了实话

第二个里面的 setUp 方法类似于init() 方法,继承自 unittest.TestCase 的类,会先执行 setUp(),在执行测试方法。如果是普通的类,你把 setUp 改成init也能达到这样的效果。

谢谢大家

buggg 回复

谢谢,昨天跳 TestCase setUp 方法跳不过去,看了下源码
def setUp(self) -> None: ...

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