2011-10-10 35 views

Trả lời

14

Bạn không thể sử dụng lệnh gọi trần super() không chứa loại/lớp. Bạn cũng không thể thực hiện thay thế cho nó sẽ hoạt động. Python 3.x chứa hỗ trợ đặc biệt để cho phép trần super() cuộc gọi (nó đặt một biến __class__ di động trong tất cả các chức năng được xác định trong một lớp - xem PEP 3135

+1

Cảm ơn. Tôi đã nhầm lẫn vì một phiên bản trước đó của PEP này cho biết bạn sẽ nhập nó với 'from __future__ import new_super' không hoạt động. –

6

Không, bạn không thể. Nhưng bạn có thể sử dụng số super() của Python 2 bằng Python 3.

3

Note Đây là một "giải pháp" kinh khủng, tôi gửi nó chỉ để ! hãy chắc chắn bạn không làm điều này ở nhà
tôi lặp lại: không làm điều này

Người ta có thể nghĩ về việc sử dụng mixin này

class Super(object): 
    def super(self): 
     return super(self.__class__, self) 

để có được một self.super():

class A(object, Super): 
    def __init__(self): 
     print "A" 

class B(A): 
    def __init__(self): 
     print "B" 
     self.super().__init__() 

năng suất:

>>> a = A() 
A 
>>> b = B() 
B 
A 

Nhưng hãy cẩn thận: này self.super() không tương đương với super(B, self) - nếu A còn gọi là self.super().__init__(), việc xây dựng một B sẽ gây ra các nhà xây dựng A để gọi chính nó vô thời hạn, kể từ self.__class__ sẽ vẫn là B . Điều này là do thiếu số __class__ được đề cập trong các accepted answer. Bạn có thể làm việc xung quanh vấn đề này với một máy trạng thái ẩn hoặc một metaclass tinh vi, ví dụ: kiểm tra vị trí của lớp thực tế trong self.__class__.mro(), nhưng nó có thực sự đáng giá không? Có lẽ không ...

15

Tôi nhận thấy câu hỏi này cũ và câu trả lời đã chọn có thể đúng vào lúc đó nhưng câu trả lời không còn hoàn thành nữa. Bạn vẫn không thể sử dụng super() trong 2.5.6, nhưng python-future cung cấp một back-ported implementation cho 2.6+:

% pip install future 
... 
% python 
... 
>>> import sys 
>>> sys.version_info[:3] 
(2, 7, 9) 
>>> from builtins import * 
>>> super 
<function newsuper at 0x000000010b4832e0> 
>>> super.__module__ 
'future.builtins.newsuper' 
>>> class Foo(object): 
... def f(self): 
... print('foo') 
... 
>>> class Bar(Foo): 
... def f(self): 
... super().f() # <- whoomp, there it is 
... print('bar') 
... 
>>> b = Bar() 
>>> b.f() 
foo 
bar 

Nếu bạn sử dụng pylint, bạn có thể vô hiệu hóa các cảnh báo di sản với những nhận xét:

# pylint: disable=missing-super-argument 
+0

Đẹp nhất, cảm ơn :) –

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