我有这行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>'
所以方法似乎在那里,但是由于某种原因我不能调用它。有人可以向我解释这种行为吗?
答案 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