Python AssertionError创建一个类

时间:2018-02-10 02:36:32

标签: python

我有一个类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]

1 个答案:

答案 0 :(得分:4)

发生了什么

当试图确定两个对象是否相等时,比如obj1 == obj2,Python将执行以下操作。

  1. 首先会尝试调用obj1.__eq__(obj2),这是一种方法 在obj1类中定义,它应该确定逻辑 平等。

  2. 如果此方法不存在,或者返回NotImplemented,那么 Python依靠调用obj2.__eq__(obj1)

  3. 如果仍然没有定论,Python将返回id(obj1) == id(obj2),  即它会告诉你两个值是否都是内存中的同一个对象。

  4. 在您的测试中,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)
    

    请注意,我正在将元素包装在元组中,然后我会比较元组的可读性,但您也可以逐个比较属性。