Why does a classmethod's super need a second argument?
按预期工作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | >>> class Foo(object): ... @classmethod ... def hello(cls): ... print 'hello, foo' ... >>> class Bar(Foo): ... @classmethod ... def hello(cls): ... print 'hello, bar' ... super(Bar, cls).hello() ... >>> b = Bar() >>> b.hello() hello, bar hello, foo |
我也可以显式调用基类:
1 2 3 4 5 6 7 8 9 10 | >>> class Bar(Foo): ... @classmethod ... def hello(cls): ... print 'hello, bar' ... Foo.hello() ... >>> b = Bar() >>> b.hello() hello, bar hello, foo |
我想知道为什么我不能像这样省略对
1 2 3 4 5 6 7 8 9 10 11 12 13 | >>> class Bar(Foo): ... @classmethod ... def hello(cls): ... print 'hello, bar' ... super(Bar).hello() ... >>> b = Bar() >>> b.hello() hello, bar Traceback (most recent call last): File"<stdin>", line 1, in <module> File"<stdin>", line 5, in hello AttributeError: 'super' object has no attribute 'hello' |
如果没有第二个参数的
1 2 3 4 5 6 7 8 9 10 11 12 | >>> class Bar(Foo): ... @classmethod ... def hello(cls): ... print Foo, type(Foo) ... print super(Bar), type(super(Bar)) ... print cls, type(cls) ... >>> b = Bar() >>> b.hello() <class '__main__.Foo'> <type 'type'> <super: <class 'Bar'>, NULL> <type 'super'> <class '__main__.Bar'> <type 'type'> |
我想我只是想知道这里的设计。为什么需要将类对象传递到super调用中以获取对基类类型
编辑:我在python 3.2中得到的错误与在2.7中为
- 搜索类层次结构的起点。
- 绑定返回方法的参数。
对于两个参数(和隐式零参数*)的情况,第二个参数用于绑定到,但如果不传入第二个参数,
为什么类方法是绑定的?因为当您子类
没有第二个参数,
1 2 3 4 5 | class Bar(Foo): @classmethod def hello(cls): print 'hello, bar' super(Bar).__get__(cls, None).hello() |
在没有上下文的实例上,
*在python 3中,如果不从绑定方法内部调用