• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

magician

FAQ de Python lol

18 mensagens neste tópico

Bom tenho andado a estudar a linguagem, desenvolver algumas coisas e frequentemente defronto-me com coisas que não encontro resposta lol por isso cá vai xD

1 - class X(object) é o mesmo que apenas class X, eu sei que a primeira herda a classe object mas todas as classes não o fazem automaticamente ?

2 - variáveis tipo __a ou __a__ ou até mesmo _a tambem já encontrei alguns métodos assim é só estética ou tem algum efeito real ?

3 - Interfaces na parte de OO não ?? Encontrei um PEP que fala nelas mas tirando isso mais nada :\

4 - As classes tem de ser todas publicas ? bem como os métodos e variáveis ??

Tinha mais umas mas agora não me lembro lol depois meto xD

Já agora se poderem responder ás minhas questões, são coisas provavelmente triviais mas que não sei como procurar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

1 - Sim é o mesmo, há quem goste mais de escrever X(object) porque acham que é mais coerente ou por outros motivos de preferencia.

2 - É uma convenção, são supostamente privados mas em rigor são nomes como outros quaisquer. O object model, esse tal falado no ponto 1, tem métodos com nomes desse tipo que por isso têm um significado especial.

3 - Não sei, provavelmente não existe. Uso simplesmente o extend de uma classe base.

4 - Sim.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

3 - Interfaces na parte de OO não ?? Encontrei um PEP que fala nelas mas tirando isso mais nada :\

Não percebi esta pergunta, ás outras o pedro já te respondeu.
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

3 - Interfaces na parte de OO não ?? Encontrei um PEP que fala nelas mas tirando isso mais nada :\

Não sei se existe ou não, mas interfaces numa linguagem dinamicamente tipada não faz muito sentido.
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não sei se existe ou não, mas interfaces numa linguagem dinamicamente tipada não faz muito sentido.

Talvez mas continuas a precisar de abstracção, embora se consiga isso com herança não é a mesma coisa...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Relativamente ao ponto 1 acho que estão errados lol vou explicar pk xD

>>> class X(object):
...     pass
...
>>> class Y:
...     pass
...
>>> dir (X)
['__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__weakref__']
>>> dir (Y)
['__doc__', '__module__']
>>>

Como podem ver á coisas muito diferentes :\ já agora podiam me explicar isto ai ai este python lol

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Acho que apesar da aparente diferença, acaba por ser o mesmo. Afinal de contas esses são nomes de métodos para tu implementares.

Olha este exemplo:

>>> class gen():
...     def __init__(self):
...         self.a="hi!"
... 
>>> b = gen()
>>> b.a
'hi!'
>>> 

O método __init__() passou a existir a a ser chamado normalmente aquando da inicialização do objecto.

De notar que em python os métodos pertecem aos objectos e não às classes.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O object é o pai de todos os tipos, normalmente ele é herdado quando se quer criar um tipo novo, é algo complexo eu ainda não percebi bem isto (a criação de tipos)...

Vê este artigo http://www.cafepy.com/article/python_types_and_objects/python_types_and_objects.html

Edit:

>>> class a:
pass

>>> type(a)
<type 'classobj'>
>>> class b(object):
pass

>>> type(b)
<type 'type'>
>>> type(list)
<type 'type'>

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nada melhor do que recorrer à ajuda do interpretador:

>>> help(object)
Help on class object in module __builtin__:

class object
|  The most base type

>>> 

Que é como quem diz, a class object é tipo A metaclass da linguagem.

Em relação à pergunta 3, não percebi, e tens a resposta à 4 na pergunta 2, mas tens uma ressalva à pergunta 2 na reposta da mesma que o pedrotuga deu :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Acho que apesar da aparente diferença, acaba por ser o mesmo. Afinal de contas esses são nomes de métodos para tu implementares.

Olha este exemplo:

>>> class gen():
...     def __init__(self):
...         self.a="hi!"
... 
>>> b = gen()
>>> b.a
'hi!'
>>> 

O método __init__() passou a existir a a ser chamado normalmente aquando da inicialização do objecto.

De notar que em python os métodos pertecem aos objectos e não às classes.

Claro que se escreves o método ele vai aparecer lá mas isso é muito diferente de overriding do método. Por exemplo no Java quando crias uma classe nova ela automaticamente herda a classe Object que é a classe Base do Java. Aqui pelos visto isso não acontece!!

Nada melhor do que recorrer à ajuda do interpretador:

>>> help(object)
Help on class object in module __builtin__:

class object
|  The most base type

>>> 

Que é como quem diz, a class object é tipo A metaclass da linguagem.

Em relação à pergunta 3, não percebi, e tens a resposta à 4 na pergunta 2, mas tens uma ressalva à pergunta 2 na reposta da mesma que o pedrotuga deu :D

Fiquei na mesma lolol xD

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Talvez mas continuas a precisar de abstracção, embora se consiga isso com herança não é a mesma coisa...

Não percebi, abstracção em que sentido?
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Abstracção talvez não tenha sido o melhor termo, mas por exemplo queres que determinada classe tenha de implementar determinados métodos como fazes isso sem interfaces ??? A herança não resolve isso pelo menos não vejo como :\

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Abstracção talvez não tenha sido o melhor termo, mas por exemplo queres que determinada classe tenha de implementar determinados métodos como fazes isso sem interfaces ??? A herança não resolve isso pelo menos não vejo como :\

Pois mas penso que isso não seja possível. Sendo tipada dinamicamente, os tipos só irão ser conhecidos durante a execução e não na altura da compilação. Para além disso tens o duck typing, o que torna o uso de interfaces desnecessário. É possível que haja uma forma de forçar durante a escrita do código que uma dada classe implemente certos métodos, mas desconheço tal e acredito que não haja.

Mesmo se houver penso que tal não garanta que durante a execução a classe ainda esteja válida (tipos dinâmicos).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Então como posso eu "obrigar" a que determinada classe implemente determinados métodos sem classes abstratas nem interfaces :O ? Pá até gosto de python estás coisas é que me matam lol

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Então como posso eu "obrigar" a que determinada classe implemente determinados métodos sem classes abstratas nem interfaces :O ? Pá até gosto de python estás coisas é que me matam lol

Não podes, o que se costuma fazer é usar as convenções tipo a dos underscores. Quem herda as tuas classes e faz m... é que tem a responsabilidade do que faz.

Eu sei que isto faz um pouco de confusão aos progradores de Java ou C#, a mim tambem me fez confusão quando ouvi pela primeira vez falar em interfaces.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ai este POO do python mata-me lolol a propósito aquilo do class x (object) parece que tem qq a ver com class new-style do python, não consegui bem perceber ao certo mas parece que temos mesmo de fazer a herança porque o python não a faz automaticamente a classe object :\

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ai este POO do python mata-me lolol a propósito aquilo do class x (object) parece que tem qq a ver com class new-style do python, não consegui bem perceber ao certo mas parece que temos mesmo de fazer a herança porque o python não a faz automaticamente a classe object :\

Não sei se te apercebeste, mas esses métodos todos que te aparecem quando herdas explicitamente o objecto base, não contêm absolutamente nada, nem os consegues chamar enquanto não os implementares manualmente.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ai este POO do python mata-me lolol a propósito aquilo do class x (object) parece que tem qq a ver com class new-style do python, não consegui bem perceber ao certo mas parece que temos mesmo de fazer a herança porque o python não a faz automaticamente a classe object :\

? Tens de fazer se quiseres fazer coisas como:

class XPTO:
    metodos todos

print XPTO(whatever)+9

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora