andrews medina

classes “new-style”

escrito em 10/02/2011

Estava conversando com um amigo sobre classes “new-style” e percebi que alguns desenvolvedores não sabem a diferença em herdar ou não a classe object ao criar uma classe em Python.

Até a versão 2.1 do Python, o tipo de todas as classes em Python era classobj. E qualquer instancia de uma classe era do tipo instance. Ou seja, todas as instâncias eram independentes de suas classes:


>>> class Foo: pass
...
>>> type(Foo)
<type 'classobj'>
>>> foo = Foo()
>>> foo.__class__
<class __main__.Foo at 0x1e4570>
>>> type(foo)
<type 'instance'>

Na versão 2.2 do Python, foi criado as classes ‘new-style’ que unificam classes e tipos. Onde uma classe não é nada mais que um tipo definido pelo programador:


>>> class Bar(object): pass
...
>>> type(Bar)
<type 'type'>
>>> Bar.__class__
<type 'type'>
>>> bar = Bar()
>>> bar.__class__
<class '__main__.Bar'>
>>> type(bar)
<class '__main__.Bar'>

Outra característica é que uma classe new-style é do tipo ‘type’ assim como as os tipos primitivos, permitindo a criação de tipos baseados nos tipos primitivos:


>>> type(list)
<type 'type'>
>>> type(Bar)
<type 'type'>
>>> class MinhaLista(list): pass
...
>>> type(MinhaLista)
<type 'type'>

Para manter questões de compatibilidade, na versão 2 do Python as classes são old-style por padrão, para que uma classe seja new-style ela tem que ser uma classe filha de uma classe new-style, onde object é a base das classes new-style. No Python 3 as classes são new-style por padrão e as classes old-style não existem mais (amém).

As classes new-style tem várias características diferentes das old-style, como é facilmente visto no exemplo abaixo:


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

Algumas diferenças são: descriptors, method resolution order e chamada de métodos especiais.

Mais informações sobre classes new-style:

blog comments powered by Disqus