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 :) –
- 1. Bạn có nên sử dụng super() bằng Python không?
- 2. Có thể sử dụng Clutter với Python 3 không?
- 3. Python: Tại sao tôi không thể sử dụng `super` trên một lớp học?
- 4. Tôi muốn sử dụng NumPy/SciPy. Tôi có nên sử dụng Python 2 hoặc 3 không?
- 5. Tại sao python super không chỉ chấp nhận cá thể?
- 6. Tôi có thể sử dụng Artifactory với Python PIP không?
- 7. Tôi có thể sử dụng python với hình vẽ không?
- 8. Tôi có sử dụng super() chính xác không?
- 9. Python mở rộng với - sử dụng siêu() Python 3 vs Python 2
- 10. Tôi có thể sử dụng mô-đun phụ Python 2.7 từ Python 2.6 không?
- 11. Tại sao tôi không thể sử dụng ttk bằng Python?
- 12. Không thể nhập cProfile bằng Python 3
- 13. Có thể nhận API Bloomberg vào Python 3 không?
- 14. Có thể sử dụng Python với php
- 15. có thể một script python chạy cả với python 2.x và python 3.x
- 16. Python trong OpenOffice 3
- 17. socket ResourceWarning sử dụng urllib trong Python 3
- 18. In không có không gian trong python 3
- 19. PySide có hỗ trợ Python 3 không?
- 20. thừa kế kim cương python và sử dụng super() trong bố mẹ của lớp dẫn xuất
- 21. Có gì mới trong Python 3.x?
- 22. Cách sử dụng string.replace() trong python 3.x
- 23. Tôi có thể sử dụng các tính năng C++ trong khi mở rộng Python không?
- 24. Tôi có thể sử dụng 32 bit dll hoặc exe trong python 64 bit không?
- 25. Làm thế nào tôi có thể sử dụng meta-dot (M-.) Trong python với emacs?
- 26. Tôi nên sử dụng phiên bản Python nào nếu tôi là người mới sử dụng Python?
- 27. Có ai thực sự sử dụng git super/subprojects không?
- 28. Sử dụng Python `isinstance` có đúng không?
- 29. Python - Có nên bắt đầu một dự án mới trực tiếp trong Python 3.x không?
- 30. Tại sao tôi không thể sử dụng danh sách dưới dạng khóa dict trong python?
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. –