Чи потрібно чи корисно успадковувати об'єкт python в Python 3.x?


94

У старшій версії python, коли ви створюєте клас в python, він може успадковувати від об'єкта, який, наскільки я розумію, має спеціальний вбудований елемент python, який дозволяє вашому об'єкту бути об'єктом нового стилю.

А як щодо новішої версії (> 3.0 та 2.6)? Я погуглив про об’єкт класу, але я отримую так багато результатів (зі зрозумілих причин). Будь-який натяк?

Спасибі!


2
Якщо ваш код також буде використовуватися під версією 2.x, добре бути чітким.
smci

1
Він добре відповів на це питання: stackoverflow.com/questions/4015417 / ...
nngeek

Відповіді:


93

Вам не потрібно успадковувати від, objectщоб мати новий стиль в python 3. Усі класи нового стилю.


5
Зверніть увагу, що це означає, що всі класи успадковують objectнезалежно від того, вводите явний (object)чи ні в Python 3.1
u0b34a0f6ae

8
Вам не потрібно, але "Портування коду Python на Python 3" говорить, що він все ще діє: docs.python.org/py3k/howto/pyporting.html#subclass-object Також: docs.python.org/reference/ ...
гіперборей

З цього допису, згаданого в коментарі nngeek, здається, хорошим стабільним посиланням на старий стиль проти нового стилю (реально стосується лише Py2) є: docs.python.org/2/reference/… - наведені вище посилання мали з тих пір змінився.
Ерік Кузіно

80

Я усвідомлюю, що це давнє запитання, але варто зазначити, що навіть у python 3 ці дві речі - не зовсім одне і те ж.

Якщо ви явно успадковуєте від object, те, що ви насправді робите, це успадковувати незалежно від builtins.object того, на що це вказує в той момент.

Тому я міг би мати якийсь (дуже дурний) модуль, який з якихось причин замінює об’єкт. Цей перший модуль ми будемо називати "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

Тоді в якомусь іншому файлі ("klasses.py"):

class Greeter(object):
    pass

class NonGreeter:
    pass

Потім у третьому файлі (який ми фактично можемо запустити):

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

Отже, ви можете бачити, що у випадку, коли він явно успадковує об’єкт, ми отримуємо іншу поведінку, ніж там, де ви дозволяєте неявне успадкування.


13
Це актуально, оскільки загалом очікується, що поведінка еквівалентна. Це не рівнозначно, звідси мої спостереження.
Філіп Адлер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.