如何在表达式中使用__class__?

时间:2017-02-26 14:45:09

标签: python

我目前正在阅读优秀的Python koans,我可以通过一些谷歌搜索来理解他们中的大多数但是这个让我感到难过(注意:__变量是占位符我必须找到的答案):

class AboutTuples(Koan):

    # ....

    def test_tuples_of_one_look_peculiar(self):
        self.assertEqual(__, (1).__class__)
        self.assertEqual(__, (1,).__class__)
        self.assertEqual(__, ("Hello comma!", ))

我理解__class__返回表达式的类型,所以在第一种情况下,这应该是“包含整数的元组”,而对于其他两种......我不太确定,因为第一个元素后面的逗号。实际上,它失败了,我得到了这个输出:

You have not yet reached enlightenment ...
    AssertionError: '-=> FILL ME IN! <=-' != <class 'int'>

如果你离开了占位符变量,这是通常的答案。在此之后,我尝试了以下内容:

self.assertEqual("<class 'int'>", (1).__class__)

但我得到以下输出:

You have not yet reached enlightenment ...
    AssertionError: "<class 'int'>" != <class 'int'>

很明显,它并不期待一个字符串,可能是某种类型......我如何在Python中表达它?其他两个测试用例的答案是否相似?

编辑:Link to the exact koan,以防万一

1 个答案:

答案 0 :(得分:2)

(1)不是元组;括号仅用于消除1.__class__的属性访问的歧义,解析器将其解释为以1.开头的格式错误的浮点文字。

(1,) ,但是,一个元组。元组由逗号定义,而不是括号,这就是为什么你可以用x = 1, 2之类的东西定义元组的原因。 (例外是空元组,()而不是(,)。)

同样,("Hello, world!",)是一个包含一个字符串的元组。

至于应该替换__的内容,__class__解析为与该对象关联的类对象,而不是字符串。您将分别使用inttuple作为示例中两次使用__class__返回的类对象。