Helpex - Trao đổi & giúp đỡ Đăng nhập
20

Tôi tự hỏi khi nào thì sử dụng hương vị của Python 3 super ().

Help on class super in module builtins:

class super(object)
 |  super() -> same as super(__class__, <first argument>)
 |  super(type) -> unbound super object
 |  super(type, obj) -> bound super object; requires isinstance(obj, type)
 |  super(type, type2) -> bound super object; requires issubclass(type2, type)

Cho đến bây giờ tôi super()chỉ sử dụng mà không có đối số và nó hoạt động như mong đợi (bởi một nhà phát triển Java).

Câu hỏi:

  • "Ràng buộc" có nghĩa là gì trong ngữ cảnh này?
  • Sự khác biệt giữa siêu đối tượng có liên kết và không được liên kết là gì?
  • Sử dụng super(type, obj)khi nào và khi super(type, type2)nào?
  • Sẽ tốt hơn nếu đặt tên cho lớp siêu cấp như trong Mother.__init__(...)?
20 hữu ích 0 bình luận 9.0k xem chia sẻ
17

Hãy sử dụng các lớp sau để trình diễn:

class A(object):
    def m(self):
        print('m')

class B(A): pass

Unbound superđối tượng không cử truy cập thuộc tính đến lớp, bạn phải giao thức mô tả sử dụng:

>>> super(B).m
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'super' object has no attribute 'm'
>>> super(B).__get__(B(), B)
<super: <class 'B'>, <B object>>

super đối tượng liên kết với cá thể cung cấp các phương thức ràng buộc:

>>> super(B, B()).m
<bound method B.m of <__main__.B object at 0xb765dacc>>
>>> super(B, B()).m()
m

super đối tượng liên kết với lớp cung cấp hàm (các phương thức không liên kết theo Python 2):

>>> super(B, B).m
<function m at 0xb761482c>
>>> super(B, B).m()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: m() takes exactly 1 positional argument (0 given)
>>> super(B, B).m(B())
m

Xem loạt bài đăng trên blog "Những điều cần biết về Python Super" của Michele Simionato ( 1 , 2 , 3 ) để biết thêm thông tin

17 hữu ích 2 bình luận chia sẻ
7

Một lưu ý nhanh, cách sử dụng mới của superđược nêu trong PEP3135 New Super đã được triển khai trong python 3.0. Có liên quan cụ thể;

super().foo(1, 2)

để thay thế cái cũ:

super(Foo, self).foo(1, 2)
7 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ python oop python-3.x super , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading