Có cần thiết hoặc hữu ích để kế thừa từ đối tượng của python trong Python 3.x không?


94

Trong phiên bản python cũ hơn khi bạn tạo một lớp trong python, nó có thể kế thừa từ đối tượng , theo tôi hiểu thì một phần tử python tích hợp sẵn đặc biệt cho phép đối tượng của bạn là một đối tượng kiểu mới.

Còn phiên bản mới hơn (> 3.0 và 2.6) thì sao? Tôi truy cập vào đối tượng lớp nhưng tôi nhận được rất nhiều kết quả (vì một lý do rõ ràng). Bất kỳ gợi ý?

Cảm tạ!


2
Nếu mã của bạn cũng sẽ được sử dụng dưới 2.x, thì tốt là bạn nên rõ ràng.
smci

1
Nó được trả lời tốt trong câu hỏi này: stackoverflow.com/questions/4015417/…
nngeek

Câu trả lời:


93

Bạn không cần phải kế thừa từ objectđể có kiểu mới trong python 3. Tất cả các lớp đều là kiểu mới.


5
Chú ý rằng phương tiện này tất cả các lớp kế thừa từ objectbất kể nếu gõ một rõ ràng (object)hay không bằng Python 3.1
u0b34a0f6ae

8
Bạn không cần phải làm như vậy, nhưng "Chuyển mã Python sang Python 3" cho biết rằng nó vẫn hợp lệ: docs.python.org/py3k/howto/pyporting.html#subclass-object Ngoài ra: docs.python.org/reference/ …
hyperboreean

Từ bài đăng này được đề cập trong nhận xét của nngeek, có vẻ như một tham chiếu ổn định tốt cho kiểu cũ so với kiểu mới (chỉ thực sự liên quan đến Py2) là: docs.python.org/2/reference/… - các liên kết ở trên dường như có kể từ khi thay đổi.
Eric Cousineau

80

Tôi nhận ra rằng đây là một câu hỏi cũ, nhưng điều đáng chú ý là ngay cả trong python 3, hai điều này không hoàn toàn giống nhau.

Nếu bạn kế thừa rõ ràng từ object, những gì bạn thực sự đang làm là kế thừa từ builtins.object bất kể điều đó trỏ đến tại thời điểm nào.

Do đó, tôi có thể có một số mô-đun (rất kỳ quặc) ghi đè đối tượng vì một số lý do. Chúng tôi sẽ gọi mô-đun đầu tiên này là "newobj.py":

import builtins

old_object = builtins.object  # otherwise cyclic dependencies

class new_object(old_object):

    def __init__(self, *args, **kwargs):
        super(new_object, self).__init__(*args, **kwargs)
        self.greeting = "Hello World!" 

builtins.object = new_object  #overrides the default object

Sau đó, trong một số tệp khác ("klasses.py"):

class Greeter(object):
    pass

class NonGreeter:
    pass

Sau đó, trong tệp thứ ba (mà chúng tôi thực sự có thể chạy):

import newobj, klasses  # This order matters!

greeter = klasses.Greeter()
print(greeter.greeting)  # prints the greeting in the new __init__

non_greeter = klasses.NonGreeter()
print(non_greeter.greeting) # throws an attribute error

Vì vậy, bạn có thể thấy rằng, trong trường hợp nó được kế thừa rõ ràng từ đối tượng, chúng tôi nhận được một hành vi khác với nơi bạn cho phép kế thừa ngầm định.


13
Nó có liên quan bởi vì nhìn chung kỳ vọng là hành vi là tương đương. Do đó, nó không tương đương với những quan sát của tôi.
Philip Adler
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.