Classe com objeto como parâmetro


114

Estou tentando traduzir algum código python para código scala. Portanto, sou um novato total em Python.

Mas por que algumas classes têm objeto como parâmetro, mas nunca o usam explicitamente? Qual é a razão para tê-lo como parâmetro em primeiro lugar?

Exemplo:

class Table(object)

Obrigado pelo seu tempo.


Respostas:


112

Em Python2, isso declara Tableser uma classe de novo estilo (em oposição à classe "clássica"). Em Python3, todas as classes são classes de novo estilo, então isso não é mais necessário.

As novas classes de estilo têm alguns atributos especiais que faltam às classes clássicas.

class Classic: pass
class NewStyle(object): pass

print(dir(Classic))
# ['__doc__', '__module__']

print(dir(NewStyle))
# ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']

Além disso, propriedades e super não funcionam com classes clássicas.

Em Python2, é uma boa ideia criar um novo estilo de classes para todas as classes. (Embora muitas classes na biblioteca padrão ainda sejam classes clássicas, para fins de compatibilidade com versões anteriores.)

Em geral, em uma declaração como

class Foo(Base1, Base2):

Fooestá sendo declarado como uma classe que herda das classes base Base1e Base2.

objecté a mãe de todas as classes em Python. É uma classe de estilo novo, assim herdando de objectmarcas Tableuma classe de estilo novo.


você pode me redirecionar para uma fonte que menciona objeto não é necessário como parâmetro no Python3? Não consigo encontrar. Obrigado
Neve

1
Ele foi mencionado muitas vezes no StackOverflow ( aqui, por exemplo ), mas não consegui encontrar uma declaração simples sobre isso nos documentos. Ele é mostrado implicitamente (pela omissão de objectda lista de bases de classes) no tutorial .
unutbu

1
A documentação do Python3 também afirma que uma "classe de novo estilo" é o "nome antigo para o tipo de classes agora usadas para todos os objetos de classe " (grifo meu). E a documentação do Python2 afirma que uma "classe de novo estilo" é qualquer classe de onde herda object. As duas instruções juntas implicam que você não precisa incluir objectna lista de bases de classe em Python3, pois todas as classes são classes de novo estilo em Python3.
unutbu

21

A Tableclasse está estendendo uma classe chamada object. Não é um argumento. O motivo pelo qual você pode querer estender objectexplicitamente é que isso transforma a classe em uma classe de novo estilo. Se você não especificar explicitamente que estende object, até Python 3, ele será uma classe de estilo antigo por padrão. (Desde Python 3, todas as classes têm um novo estilo, quer você estenda explicitamente objectou não.)

Para obter mais informações sobre classes de estilo antigo e novo, consulte esta pergunta .


1
Esta é a resposta mais direta e sucinta. Obrigado.
Sabuncu de

3

Apenas uma observação de que a distinção de classe “novo estilo” vs “estilo antigo” é específica para Python 2.x; no 3.x, todas as classes são “novo estilo”.


2

A classe Table e a classe Table (objeto) não são diferentes para Python.

Não é um parâmetro, ele se estende do objeto (que é a classe base como muitas outras linguagens).

Tudo o que diz é que herda tudo o que está definido em "objeto". Este é o comportamento padrão.


3
A extensão automática de classes objecté o comportamento padrão apenas no Python 3. No python 2, um objeto de extensão de classe possui atributos que uma classe que não estende o objeto não terá.
Lewis Ellis

1

object é o tipo mais básico de objeto de classe definido em python. Os atributos do objeto podem ser vistos como abaixo

** >>> dir (objeto)

[' classe ', ' delattr ', ' doc ', ' formato ', ' getattribute ', ' hash ', ' init ', ' novo ', ' reduzir ', ' reduzir_ex ', ' repr ', ' setattr ', ' sizeof ',' str ',' subclasshook '] **

Portanto, Table (objeto) é apenas herança.!


0

1) Nome da classe (objeto): 2) nome da classe: Ambos são iguais, mas primeiro um muito melhor em termos de escrita, parece melhor enquanto herda outras classes para outra, parece homogêneo.

Como mesmo? Então, tudo em Python está sob o objeto significa que tudo em Python tem propriedade de objeto, se escrever ou não ele vai entender. Na primeira, nós explicamos isso explicitamente, na segunda, não.


Este não é o caso do Python 2, consulte a resposta aceita para obter os detalhes.
niemmi
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.