2011-01-13 37 views
7

Tại sao tôi không thể sử dụng super để nhận được một phương thức của lớp học cấp cao?Python: Tại sao tôi không thể sử dụng `super` trên một lớp học?

Ví dụ:

Python 3.1.3 
>>> class A(object): 
...  def my_method(self): pass 
>>> class B(A): 
...  def my_method(self): pass 
>>> super(B).my_method 
Traceback (most recent call last): 
    File "<pyshell#2>", line 1, in <module> 
    super(B).my_method 
AttributeError: 'super' object has no attribute 'my_method' 

(Tất nhiên đây là một trường hợp tầm thường mà tôi chỉ có thể làm A.my_method, nhưng tôi cần này cho một trường hợp của kim cương thừa kế.)

Theo super 's tài liệu, nó có vẻ như những gì tôi muốn nên có thể. Đây là tài liệu hướng dẫn super 's: (tôi nhấn mạnh)

super() -> giống như super(__class__, <first argument>)

super(type) -> siêu đối tượng cởi

super(type, obj) -> ràng buộc super đối tượng; yêu cầu isinstance(obj, type)

siêu (loại, loại2) -> liên kết siêu đối tượng; đòi hỏi issubclass (type2, loại)

[ví dụ không liên quan redacted]

+0

tôi đã xóa câu trả lời của tôi - Tôi đã nhận các lỗi tương tự. Rất lạ, sẽ nhìn vào nó nhiều hơn một chút. –

Trả lời

7

Theo this nó có vẻ như tôi chỉ cần gọi super(B, B).my_method:

>>> super(B, B).my_method 
<function my_method at 0x00D51738> 
>>> super(B, B).my_method is A.my_method 
True 
+0

Thú vị. Không biết điều đó sẽ hiệu quả. – James

+1

Vui mừng nguồn được liên kết đã giúp. :) – James

+3

Hãy nhớ rằng điều này sẽ cung cấp cho bạn phương pháp không ràng buộc; lý do bạn thường cần nói 'super (B, self) 'là lấy một đối tượng siêu liên kết với một đối tượng, để lấy các phương thức bị ràng buộc. –

8

Có vẻ như bạn cần một thể hiện của B để vượt qua trong như là đối số thứ hai.

http://www.artima.com/weblogs/viewpost.jsp?thread=236275

+0

+1, đọc tốt, phần 2/3 của loạt bài này mô tả các vấn đề chính xác và trường hợp sử dụng thực sự cho các đối tượng siêu không liên kết': http://www.artima.com/weblogs/viewpost.jsp?thread=236278 (Bí mật của các vật thể không liên kết) – ChristopheD

Các vấn đề liên quan