Jump to content
manuelr

Argumento self

Recommended Posts

manuelr

boas.

sou iniciante no python, e embora já tenho lido bastante documentação, ainda não consegui entender o argumento self.

alguém poderia dar-me umas "luzes"?

cumprimentos

Share this post


Link to post
Share on other sites
Gnrtuga

Bom, também não percebo muito disto, mas :

quando um método é definido numa classe, o seu primeiro argumento deve de ser uma variável que represente o objecto que o método está a chamar. por convenção este argumento é chamado de self.

Não sei se ajuda, mas fica a intenção.

Pode ser que alguém consiga explicar melhor....


Férias! Estou por aqui: http://maps.google.p...001549&t=h&z=20 (a bulir claro está!)

Nunca mais é verão outra vez.. :)

Share this post


Link to post
Share on other sites
KTachyon

Enquanto que noutras linguagens o argumento self (ou equivalente) é implícito, no Python optou-se que esse argumento fosse explícito.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
Toaki

Inicialmente também me custou um bocado a entranhar nas classes muito por causa desse self. Não sou informático da pesada (apenas freelancer) por isso da teoria não percebo muito (também sou iniciante no Python, com apenas um ano de contacto), mas na prática, da experiência que tenho tido, imagina o self da seguinte forma: o self é a cola interna das classes. Imagina que cada método é independente, dentro das classes, mas o self transporta as variáveis internas da class, que são partilhadas entre todos os métodos. Quando defines, em algum ponto, uma variável através do self, ela torna-se acessível em qualquer parte da classe, por exemplo, tens a variável var, apenas acessível dentro de um método particular:

var = 500

Se a definires com o self ela fica acessível em qualquer ponto da class:

self.var = var

Quando crias um método dentro da class, o self tem de ser sempre mencionado (Python optou por mencioná-lo explicitamente), pois é como a cola da class entre os métodos, e transporta a variáveis próprias da class.

A explicação não é muito técnica, e possivelmente algum entendido ainda me dá nas orelhas se ler esta explicação tão labrega, mas explico assim pois foi esta imagem (de que o self é a cola/partilha dentro da class) que me ajudou a perceber e usá-lo mais à vontade.

Um abraço e força nisso, Python é uma linguagem incrível depois de dominada :)

Edited by Toaki

Share this post


Link to post
Share on other sites
Pedro C.

Suspeito que a pergunta advenha, de facto, de veres esse argumento na descrição de funções. Geralmente a construção de classes é algo posterior. De qualquer maneira o self pode ser entendido da maneira que se lê. Por exemplo:

In [10]: a = [1,2,3,4,5]
In [11]: a.index(2)
Out[11]: 1

Neste exemplo criei a lista a e chamei de dentro dela uma função index que indica em que indice se encontra o valor 2 na lista. Dentro desta função existe um argumento self embora invisivel. Por esse motivo é que podemos chamar a função a partir do objecto (com a nomenclatura do ponto . ). Dando outro exemplo chamo desta vez a função min na qual não tem argumentos excepto o self (agora estou a usar outro tipo de objectos que não lista):

In [12]: import numpy as np
In [13]: a = np.zeros(3)
In [14]: a.min()
Out[14]: 0.0

A função min tem como único argumento o self, melhor dizendo tem como único argumento o objecto a partir do qual foi chamada. O self é o próprio objecto. Uma definição de classe pode ajudar a compreender o conceito. Uma lista não tem embutida a função min e max (como é o caso dos arrays numpy do exemplo acima) mas se eu quisess criar função especificas para isso entao podia fazer assim:

class objecto():
def __init__(self,lista):
 self.dados = lista

def minimo(self):
 return min(self.dados)

def maximo(self):
 return max(self.dados)

a = objecto([1,2,3])
print a.minimo()
print a.maximo()

Criei uma classe que recebe uma lista e dentro dessa classe tem uma variável (que pertence ao self) onde se guarda a lista e duas funções, minimo e máximo, que fazem o que o nome diz. Podia até fazer uma função que alterasse os próprios dados.

NOTA: a função def __init__ está lá na definição da classe porque indica que ao iniciarmos aquela classe (que chamei objecto e atribui à variável a) os comandos que se lhe seguem devem ser cumpridos, neste caso que a lista de entrada deve passar para variável dados do self.

Share this post


Link to post
Share on other sites
KTachyon

Inicialmente também me custou um bocado a entranhar nas classes muito por causa desse self. Não sou informático da pesada (apenas freelancer) por isso da teoria não percebo muito (também sou iniciante no Python, com apenas um ano de contacto), mas na prática, da experiência que tenho tido, imagina o self da seguinte forma: o self é a cola interna das classes. Imagina que cada método é independente, dentro das classes, mas o self transporta as variáveis internas da class, que são partilhadas entre todos os métodos.

Gostei. Mas cometeste uma pequena gafe na informação que deste a seguir:

Quando defines, em algum ponto, uma variável através do self, ela torna-se acessível em qualquer parte da classe, por exemplo, tens a variável var, apenas acessível dentro de um método particular:

var = 500

Se a definires com o self ela fica acessível em qualquer ponto da class:

self.var = var

Na realidade, estás a criar uma propriedade no objecto (ou qualquer outra nomenclatura por que decidas optar) com o valor de var. Se agora alterares o valor de var, a self.var continuará a ser 500. Estás a atribuir o valor de uma variável à outra e não a torná-la numa propriedade do objecto.

Edited by KTachyon

“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.