Tôi có thể sử dụng cú pháp Python 3 super()
trong Python 2.5.6 không?
Có thể với một số loại nhập __future__
?Tôi có thể sử dụng Python 3 super() trong Python 2.5.6 không?
Trả lời
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
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.
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 ...
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
Đẹp nhất, cảm ơn :) –
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. –