Python 关于 python 成员变量

cheunghr · August 14, 2019 · Last by cheunghr replied at August 15, 2019 · 1135 hits
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也能达到这样的效果。

cheunghr #10 · August 15, 2019 作者

谢谢大家

cheunghr #11 · August 15, 2019 作者

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

12Floor has been deleted
需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up