Chamar Método ou Propriedade dinamicamente

537 views
Skip to first unread message

Charles Souza Silva

unread,
Jun 25, 2012, 7:47:18 AM6/25/12
to python...@googlegroups.com
Olá Pessoal, sou um programador de PHP entrando no mundo Python. Eu tenho o seguinte código em PHP:

class Carro {

    propriedade1 = 1;
    propriedade2 = 2;

    method1()
    method2()


  .......

}

$name_prop = "propriedade2";
$name_metodo = "method2";

$valor = Carro.$name_prop;   //retorna 2
Carro.$name_metodo; //executa o metodo method2

Como posso fazer esse compartamento dinamico no python?

Charles



Denis Costa

unread,
Jun 25, 2012, 7:57:53 AM6/25/12
to python...@googlegroups.com
Isso é um começo para o que você quer.

class Algo(object):
    algum_valor = 1

    def faca_algo(self):
        return True


a = Algo()

print(getattr(a, 'algum_valor')) # 1
print(getattr(a, 'faca_algo')()) # True

--
Denis Costa

“First, solve the problem. Then, write the code.” - John Johnson

Miguel Elias dos Santos

unread,
Jun 25, 2012, 7:58:52 AM6/25/12
to python...@googlegroups.com
Apesar d não saber muito de python....

creio que esse link possa ajudar =]

http://stackoverflow.com/questions/3061/calling-a-function-from-a-string-with-the-functions-name-in-python

--
Miguel Elias dos Santos
WebDeveloper PHP

1. Quando um cientista distinto e experiente diz que algo é possível, é quase certeza que tem razão. Quando ele diz que algo é impossível, ele está provavelmente errado.
2. O único caminho para desvendar os limites do possível é aventurar-se um pouco além dele, adentrando o impossível.
3. Qualquer tecnologia suficientemente avançada é indistinguível de magia.

Nycholas de Oliveira e Oliveira

unread,
Jun 25, 2012, 10:53:43 AM6/25/12
to python...@googlegroups.com
Bom dia,

2012/6/25 Charles Souza Silva <charc...@gmail.com>


Como posso fazer esse compartamento dinamico no python?

Talvez o seu problema seja escrever código OO em Python, segue
um apresentação[1] do Luciano Ramalho que elucida vários pontos
de confusão em escrever código OO em Python quando se conhece
outras linguagens.


[1] - http://www.slideshare.net/ramalho/orientao-a-objetos-em-python-presentation


--
Até mais e boa sorte,
Nycholas de Oliveira e Oliveira.

Alex

unread,
Jul 16, 2012, 3:45:57 PM7/16/12
to python...@googlegroups.com
def f(self, *args):
    print args

class Carro(object):
    prop = 1

Car.fun = staticmethod(f) # atriubuindo uma função a classe Carro.
Carro.f = f # atribundo uma função dinamicamente a instância do objeto
Carro.prop_2 = 100

setattr(Car, "dinamic", 100) # atribuinção mais dinâmica ainda.
# ----------

car = Carro()

car.prop_3 = 300 ## atributo só da instância de Carro
car.prop_2 ## = 100
car.f() # print args

As possibilidades são muitas...

Artur Felipe Sousa

unread,
Jul 16, 2012, 9:44:41 PM7/16/12
to python...@googlegroups.com
Como você tem os nomes dos atributos e/ou métodos como string, a melhor forma de se fazer é usando a função built-in getattr(object, name[, default])[1] que retorna o valor de qualquer atributo de uma instância.

Usando o seu exemplo:

class Carro():
    propriedade1 = 1
    propriedade2 = 2

    def method1(self):
         return self.propriedade1 + propriedade2

    def method2(self):
         pass

>> c = Carro()
>> getattr(c, 'propriedade1')
1
>> getattr(c, 'method1')
<bound method Carro.method1 of <__main__.Carro instance at 0x1026059e0>>

Note que no caso de acesso ao método, o retorno foi um método vinculado à instância c, isto é, uma instância do tipo 'instancemethod'
que pode ser então executada assim:

>> metodo = getattr(c, 'method1')
>> metodo()
3

É muito interessante o fato de que em python uma função, uma classe, um método... são todos instâncias de algo. O Luciano Ramalho dá um curso super legal que esclarece bastante
assuntos desse tipo, o PPQSP[2].

Espero ter ajudado.

[]s


Em segunda-feira, 25 de junho de 2012 08h47min18s UTC-3, Charles Souza Silva escreveu:
Reply all
Reply to author
Forward
0 new messages