python - 引用单元测试中的相同实例(调用对象时不创建新实例)
问题描述
背景:我创建了一个类来从谷歌中提取信息。此类搜索搜索词并在搜索词有任何拼写错误时建议更正。
class gs:
url_part1 = "https://www.googleapis.com/customsearch/v1?key="
key = "some_key"
cse = 'some_key'
suggestion = 'None'
def __init__(self, search):
self.search = search
self.url = gs.url_part1 + gs.key + gs.cse + self.search
#gs.suggestion = 'None'
def get_suggestion(self):
r = requests.get(url=self.url)
r_json = r.json()
if 'spelling' in r_json.keys():
gs.suggestion = r_json.get('spelling').get('correctedQuery')
return gs.suggestion
例如,如果我搜索 paytn(正确的名称是 paytm),那么这个类建议更正 paytn 是 paytm
gs_1 = gs(search='paytn')
suggestion_1 = gs_1.get_suggestion()
print(suggestion_1) #suggestion for incorrect name
'paytm'
如果我搜索“paytm”而不是搜索 paytn,那么 gs 类没有任何建议。
gs_2 = gs(search='paytm')
suggestion_2 = gs_2.get_suggestion()
print(suggestion_2) #no suggestion for correct name
'None'
现在,在为 gs 类创建单元测试用例时,我观察到了一个非常奇怪的行为。self.gs_2正在从self.gs_1中获取值 并且未通过以下测试。
from search import gs
import unittest
class TestSearch(unittest.TestCase):
def setUp(self):
self.gs_1 = gs(search='paytn')
self.gs_2 = gs(search='paytm')
def test_get_suggestion(self):
self.assertEqual(self.gs_1.get_suggestion(), 'paytm')
self.assertEqual(self.gs_2.get_suggestion(), 'None')
if __name__ == '__main__':
unittest.main()
经过检查,很明显 self.gs_2 正在从 gs 类的第一个实例中获取值。请参考下面的输出
import search
suggestion 1 in setUp paytm
suggestion 2 in setUp paytm
F
======================================================================
FAIL: test_get_suggestion (test.TestSearch)
----------------------------------------------------------------------
Traceback (most recent call last):
File "D:\YBL\test.py", line 15, in test_get_suggestion
self.assertEqual(self.gs_2.get_suggestion(), 'None')
AssertionError: 'paytm' != 'None'
- paytm
+ None
----------------------------------------------------------------------
Ran 1 test in 3.028s
FAILED (failures=1)
谁能帮我理解
1)我的理解是否正确?
2) 为什么它从 gs_1 获取值而不是创建一个新实例?
解决方案
class gs:
url_part1 = "https://www.googleapis.com/customsearch/v1?key="
key = "some_key"
cse = 'some_key'
def __init__(self, search):
self.search = search
self.url = gs.url_part1 + gs.key + gs.cse + self.search
self.suggestion = 'None'
def get_suggestion(self):
r = requests.get(url=self.url)
r_json = r.json()
if 'spelling' in r_json.keys():
self.suggestion = r_json.get('spelling').get('correctedQuery')
return self.suggestion
您使用suggestion
in gs
(整个类相同),而不是self.suggestion
特定于实例的。您可以通过访问该值的方式查看它 -gs.suggestion
表示它属于gs
,self.suggestion
表示它属于传递给该方法的当前实例。;)
在您的情况下,第一遍覆盖了 thegs.suggestion
而第二遍没有覆盖,因此它返回了以前的值。
推荐阅读
- javascript - Jquery onkeyup 或 onchange 函数取决于 HTML 表单中的值
- c# - jQuery更新@Html.TextBoxFor时如何刷新@Html.ValidationMessageFor?
- microservices - jhipster 仅适用于后端还是前端?
- r - 当每列和每行的总和已知时,如何找到仅由0和1组成的精确矩阵
- firebase-authentication - 离线时无法在颤振应用程序中使用signInWithEmailAndPassword
- java - 提示用户输入字符串。显示文本以及第一个和最后一个字符
- directx - directx编译问题需要咨询
- java - 扫描仪 JAVA 某些要求
- c# - 找出所有加起来为 N 的 1 和 2 的组合
- python - 如何从特定类别中抽取批次?