É necessário ou útil herdar do objeto python no Python 3.x?

92

Na versão mais antiga do python, quando você cria uma classe em python, ela pode herdar de um objeto que é, até onde eu entendo, um elemento python embutido especial que permite que seu objeto seja um objeto de novo estilo.

E quanto à versão mais recente (> 3.0 e 2.6)? Eu pesquisei sobre o objeto de classe, mas obtive muitos resultados (por razões óbvias). Alguma dica?

Obrigado!

Thomas
fonte
2
Se o seu código também for usado em 2.x, é bom ser explícito.
smci
1
Esta pergunta está bem respondida: stackoverflow.com/questions/4015417/…
nngeek

Respostas:

89

Você não precisa herdar de objectpara ter um novo estilo no python 3. Todas as classes têm um novo estilo.

SilentGhost
fonte
5
Observe que isso significa que todas as classes herdam objectindependentemente de digitar um explícito (object)ou não no Python 3.1
u0b34a0f6ae
8
Você não precisa fazer isso, mas o "Porting Python code to Python 3" diz que ainda é válido: docs.python.org/py3k/howto/pyporting.html#subclass-object Também: docs.python.org/reference/ …
hiperboreiano de
Deste post mencionado no comentário de nngeek, parece que uma boa referência estável para estilo antigo versus estilo novo (apenas realmente relevante para Py2) é: docs.python.org/2/reference/… - os links acima pareciam ter desde mudou.
Eric Cousineau
76

Sei que essa é uma questão antiga, mas é importante notar que mesmo em python 3 essas duas coisas não são exatamente a mesma coisa.

Se você herda explicitamente de object, o que você está realmente fazendo é herdar de, builtins.object independentemente do que isso aponte no momento.

Portanto, eu poderia ter algum módulo (muito estranho) que substitui o objeto por algum motivo. Chamaremos este primeiro módulo de "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

Depois, em algum outro arquivo ("klasses.py"):

class Greeter(object):
    pass

class NonGreeter:
    pass

Em seguida, em um terceiro arquivo (que podemos realmente executar):

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

Portanto, você pode ver que, no caso em que está explicitamente herdando do objeto, obtemos um comportamento diferente daquele onde você permite a herança implícita.

Philip Adler
fonte
1
Este é um comentário inútil que desvia a pergunta original e a resposta (correta). Claro, se você modificar os builtins, ele se comportará de maneira diferente. Não faça isso.
harmv
11
É relevante porque em geral a expectativa é de que o comportamento seja equivalente. Não é equivalente, daí minhas observações.
Philip Adler