有人可以向我解释为什么这样有效(在Python 2.5中):
class Foo(object):
pass
class Bar(Foo):
pass
print(Foo.__subclasses__())
Run Code Online (Sandbox Code Playgroud)
但这不是:
class Foo():
pass
class Bar(Foo):
pass
print(Foo.__subclasses__())
Run Code Online (Sandbox Code Playgroud)
后者返回"AttributeError:class Foo没有属性' __subclasses__'",但我不知道为什么.我知道这与旧式和新式类有关,但我不清楚为什么会使这个功能不可用.
澄清:我希望理解为什么__subclasses__()老式的不可用,我得到的方法对于旧式的类不存在但我不知道它是什么新的样式使这些新的功能可能.
man*_*est 31
class Foo(object):
pass
Run Code Online (Sandbox Code Playgroud)
上面的类是一个"新式"类,因为它继承自对象类.新式类提供了许多"旧式"类没有的额外框架.新样式类的一个特定属性是能够使用__subclasses__方法确定类的子类.
关于新式类和__subclasses__方法有一些 很好的 讨论,它们完全没有文档记录.(不过这是蒂姆·彼得斯的非官方解释.)
"每个新样式类都保留一个对其直接子类的弱引用列表.此方法返回所有那些仍然存活的引用的列表."
因此,要回答您的问题,__subclasses__功能不可用,因为在您的第二个示例中:
class Foo():
pass
Run Code Online (Sandbox Code Playgroud)
旧式类Foo不从对象继承(因此它不是新式类),并且不会继承__subclasses__方法.
注意,如果您不理解为什么旧式类没有__subclasses__方法,您可以随时启动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__']
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14916 次 |
| 最近记录: |