有人能给我解释一下为什么这是可行的(在Python2.5中):

class Foo(object):
    pass

class Bar(Foo):
    pass

print(Foo.__subclasses__())

但这并不是:
class Foo():
    pass

class Bar(Foo):
    pass

print(Foo.__subclasses__())

后者返回“attributeError:ClassFoo没有属性“__subclasses__”,但我不知道为什么。我知道这与旧样式类和新样式类有关,但我不清楚为什么这会使这个功能不可用。
澄清:我想了解为什么在旧样式中不存在__subclasses__()方法,我知道旧样式类不存在该方法,但我不知道新样式使这些新功能成为可能的原因。

最佳答案

class Foo(object):
    pass

上面的类是“新样式”类,因为它继承自对象类。新样式类提供了许多“旧样式”类没有的额外框架。新样式类的一个特殊属性是能够用u subclasses_uuu方法确定类的子类。
有关于新样式类和用于完全的子类方法的。(some是蒂姆·彼得斯的非正式解释。)
“每个新样式的类都保存一个弱引用列表,这些弱引用指向它的直接子类。此方法返回所有仍处于活动状态的引用的列表。”
因此,要回答您的问题,“子类”功能不可用,因为在第二个示例中:
class Foo():
    pass

旧样式类foo不是从对象继承的(因此它不是一个新样式类),那里for不继承uu子类uuu方法。
注意,如果您不理解为什么旧样式类没有\子类\方法,那么您可以随时启动一个python解释器,并使用dir进行一些检查。
>>> class Foo(object):
...     pass
...
>>> dir(Foo.__class__)
['__abstractmethods__', '__base__', '__bases__', '__basicsize__', '__call__', '__class__', '__delattr__', '__dict__', '__dictoffset__', '__doc__', '__
eq__', '__flags__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__instancecheck__', '__itemsize__', '__le__', '__lt
__', '__module__', '__mro__', '__name__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__s
ubclasscheck__', '__subclasses__', '__subclasshook__', '__weakrefoffset__', 'mro']
>>> class Bar():
...     pass
...
>>> dir(Bar.__class__)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: class Bar has no attribute '__class__'
>>> dir(Bar)
['__doc__', '__module__']
>>> dir(Foo)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '
__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']

10-04 13:37