này làm việc như mong đợi:Tại sao siêu hạng của một classmethod cần một đối số thứ hai?
>>> 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
tôi cũng có thể gọi lớp cơ sở một cách rõ ràng:
>>> class Bar(Foo):
... @classmethod
... def hello(cls):
... print 'hello, bar'
... Foo.hello()
...
>>> b = Bar()
>>> b.hello()
hello, bar
hello, foo
tôi đã tự hỏi tại sao tôi không thể bỏ qua đối số đầu tiên super
, như thế này:
>>> 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'
khi kết quả cuộc gọi super
không có đối số thứ hai có vẻ là loại lớp bên trong một loại siêu :
>>> 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'>
Tôi đoán tôi đang tự hỏi về thiết kế ở đây. Tại sao tôi cần truyền đối tượng lớp vào cuộc gọi siêu để nhận tham chiếu đến loại lớp cơ sở Foo
? Đối với một phương pháp bình thường, nó có ý nghĩa để vượt qua self
cho hàm, vì nó cần phải ràng buộc kiểu lớp cơ sở với một thể hiện thực tế của lớp đó. Nhưng một classmethod không cần một instance cụ thể của class.
EDIT: Tôi gặp lỗi tương tự trong Python 3.2 như tôi đã làm ở trên trong 2.7 cho super(Bar).hello()
. Tuy nhiên, tôi chỉ có thể làm super().hello()
và hoạt động tốt.
Trong python 3.x họ sửa siêu cuộc gọi khá một chút ... trong python2x họ chỉ không nghĩ rằng thông qua đó nhiều (là tôi đoán ...) anyway tôi nghĩ rằng điều này sẽ kết thúc đóng như câu hỏi "Tại sao" thường là ... –
Bạn có thể thấy điều này hữu ích: http://stackoverflow.com/questions/11354786/super-confusing-python-multiple-inheritance-super?rq=1 – mdscruggs
@JoranBeasley meh, I đã hỏi một số câu hỏi kiểu tại sao trước đó chưa được đóng lại. – jterrace