无法在格式字符串扩展内调用__subclass__方法

时间:2019-06-05 08:53:24

标签: python

我有这行python代码,可返回当前存在的所有类的列表:

'a'.__class__.__mro__[1].__subclasses__()

现在,我希望这一行能以相同的方式工作:

'{0.__class__.__mro__[1].__subclasses__()}'.format('a')

但这给了我错误:

AttributeError: type object 'object' has no attribute '__subclasses__()'

然后再次显示这一行:

'{0.__class__.__mro__[1].__subclasses__}'.format('a')

打印出

'<built-in method __subclasses__ of type object at 0x9d1260>'

所以方法似乎在那里,但是由于某种原因我不能调用它。有人可以向我解释这种行为吗?

3 个答案:

答案 0 :(得分:4)

str.format不支持格式字符串中的任意表达式。您可以使用索引和属性访问,但不能使用函数调用运算符(甚至索引也有些奇怪)。与其尝试将所有内容填充到格式字符串本身中,不如在表达式外部求值并将结果作为参数传递给format

'{}'.format('a'.__class__.__mro__[1].__subclasses__())

偶然地,此__subclasses__调用不会为您提供所有存在的子类的列表。它为您提供object的所有 direct 子类的列表。它不包括孙子类或其他后代。

此外,除非您尝试执行某种沙箱逃逸操作或遇到其他怪异的约束,否则您不必为了引用{{1 }}。

答案 1 :(得分:0)

您正在访问属性"__subclass__()"(字符串!),而不是访问__subclass__函数,然后调用它。即格式字符串不执行该函数,并以字符串形式返回结果。

要证明,请尝试以下方法:

>>> '{0.__class__.__mro__[1].__str__}'.format('a')
"<slot wrapper '__str__' of 'object' objects>"

>>> '{0.__class__.__mro__[1].__str__()}'.format('a')
AttributeError: type object 'object' has no attribute '__str__()'

答案 2 :(得分:0)

如上所述,str.format不允许通话。

如果您确实想要这种行为,可以尝试使用f字符串(如果您使用的是Python 3.6 +):

>>> x = 'a'
>>> f'{x.__class__.__mro__[1].__subclasses__()}'
# output omitted