privados - llamar metodo de otra clase python
¿Cómo crear objetos en línea con propiedades en Python? (8)
Es fácil en Python declarar una clase con una función __init__()
que puede configurar la instancia por usted, con argumentos opcionales. Si no especifica los argumentos, obtiene una instancia en blanco y si especifica algunos o todos los argumentos, inicializa la instancia.
Lo expliqué here (mi respuesta mejor calificada hasta la fecha), así que no volveré a escribir la explicación. Pero, si tiene alguna pregunta, pregunte y responderé.
Si solo quieres un objeto genérico cuya clase realmente no importe, puedes hacer esto:
class Generic(object):
pass
x = Generic()
x.foo = 1
x.bar = 2
x.baz = 3
Una extensión obvia sería agregar una función __str__()
que imprime algo útil.
Este truco es agradable a veces cuando quieres un diccionario más conveniente. Me resulta más fácil escribir x.foo
que x["foo"]
.
En Javascript sería:
var newObject = { ''propertyName'' : ''propertyValue'' };
¿Cómo hacerlo en Python?
La respuesta de Peter
obj = lambda: None
obj.propertyName = ''propertyValue''
Me gusta Smashery''s idea Smashery''s , pero Python parece contento de poder modificar las clases por su cuenta:
>>> class Inline(object):
... pass
...
>>> obj = Inline()
>>> obj.test = 1
>>> obj.test
1
>>>
Funciona bien en Python 2.5 para mí. Tenga en cuenta que tiene que hacer esto a una clase derivada de un object
; no funcionará si cambia la línea a obj = object
.
No sé si hay una forma integrada de hacerlo, pero siempre puedes definir una clase como esta:
class InlineClass(object):
def __init__(self, dict):
self.__dict__ = dict
obj = InlineClass({''propertyName'' : ''propertyValue''})
Otra opción viable es usar namedtuple :
from collections import namedtuple
message = namedtuple(''Message'', [''propertyName''], verbose=True)
messages = [
message(''propertyValueOne''),
message(''propertyValueTwo'')
]
Python 3.3 agregó la clase SimpleNamespace
para ese propósito exacto:
>>> from types import SimpleNamespace
>>> obj = SimpleNamespace(propertyName=''propertyValue'')
>>> obj
namespace(propertyName=''propertyValue'')
>>> obj.propertyName
''propertyValue''
Además del constructor apropiado para construir el objeto, SimpleNamespace
define __repr__
y __eq__
( documentados en 3.4 ) para comportarse como se espera.
class test:
def __setattr__(self,key,value):
return value
myObj = test()
myObj.mykey = ''abc'' # set your property and value
obj = type(''obj'', (object,), {''propertyName'' : ''propertyValue''})