É 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!


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.


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.