我有一个类User和一个类Theme。用户类可以创建主题,向主题词典添加主题,并且应该能够返回主题词典。我对python很陌生,所以我遇到了python逻辑/语法问题
class User:
def __init__(self, name):
self.themes = {}
def createTheme(self, name, themeType, numWorkouts, themeID, timesUsed):
newTheme = Theme(name, themeType, numWorkouts, themeID, timesUsed)
return newTheme
和我的主题课:
class Theme:
def __init__(self, name, themeType, numWorkouts, themeID, timesUsed):
#themeType: 1 = genre, 2 = artist, 3 = song
self.name = name
self.themeType = themeType
self.numWorkouts = numWorkouts
self.themeID = themeID
self.timesUsed = timesUsed
我在testUser中运行测试:
## test createTheme
theme1 = Theme("theme", 2, 5, 1, 0)
self.assertEqual(usr1.createTheme("theme", 2, 5, 1, 0), theme1)
但是我得到了 - Traceback(最近一次调用最后一次): 文件" /Tests/testUser.py",第52行,在测试中 self.assertEqual(usr1.createTheme(" theme",2,5,1,0),theme1) 断言错误:!=
我不确定我做错了什么,有人可以帮忙吗?
(另外,我在用户中有以下方法,但由于我的createTheme不起作用,但还没有能够测试它们,但我可以使用一些帮助来查看我的错误是否存在逻辑/语法:
# returns dict
# def getThemes(self):
# return self.themes
#
# def addTheme(self, themeID, theme):
# if theme not in self.themes:
# themes[themeID] = theme
#
# def removeTheme(self, _theme):
# if _theme.timesUsed == _theme.numWorkouts:
# del themes[_theme.themeID]
答案 0 :(得分:4)
当试图确定两个对象是否相等时,比如obj1 == obj2
,Python将执行以下操作。
首先会尝试调用obj1.__eq__(obj2)
,这是一种方法
在obj1
类中定义,它应该确定逻辑
平等。
如果此方法不存在,或者返回NotImplemented
,那么
Python依靠调用obj2.__eq__(obj1)
。
如果仍然没有定论,Python将返回id(obj1) == id(obj2)
,
即它会告诉你两个值是否都是内存中的同一个对象。
在您的测试中,Python必须回退到第三个选项,您的对象是类Theme
的两个不同实例。
如果期望对象Theme("theme", 2, 5, 1, 0)
和usr1.createTheme("theme", 2, 5, 1, 0)
相等,因为它们具有相同的属性,则必须定义Theme.__eq__
方法,如此。
class Theme:
def __init__(self, name, themeType, numWorkouts, themeID, timesUsed):
#themeType: 1 = genre, 2 = artist, 3 = song
self.name = name
self.themeType = themeType
self.numWorkouts = numWorkouts
self.themeID = themeID
self.timesUsed = timesUsed
def __eq__(self, other)
# You can implement the logic for equality here
return (self.name, self.themeType, self.numWorkouts, self.themeID) ==\
(other.name, other.themeType, other.numWorkouts, other.themeID)
请注意,我正在将元素包装在元组中,然后我会比较元组的可读性,但您也可以逐个比较属性。