2012-01-20 13 views
5

En matlab, puedo crear una matriz de estructura (struct) haciendo lo siguiente.Crear un objeto sin llamar a una clase

person.name = 'Mike'; 
person.age = 25; 
person.gender = 'male'; 

donde la persona no está definida antes de crear la estructura. Cuando trato de hacerlo en Python, me da un error

name 'person' is not defined 

¿Hay una manera similar de hacerlo en Python? Gracias

EDITAR: Siendo nuevo en python, todavía pienso en matlab. El problema que tengo es que tengo una función que tomará múltiples entradas (más de 40), así que en lugar de tener la función (entrada1, entrada2, ..., entrada40), tendré la función (entrada) donde la entrada consiste en input.1, input.2, .., input.40.

+1

El enfoque de Matlab tiene muy poco sentido. ¿Por qué querrías hacer algo así en Python? ¿Qué hay de malo en hacer cosas en Python siguiendo las reglas del lenguaje Python? ¿Por qué intentar imponer reglas de un idioma diferente en Python? –

+0

Hola S.Lott, mira mi comentario sobre la respuesta de kindall a continuación. – mikeP

+0

Realmente quieres un diccionario de Python –

Respuesta

6

Python no va a crear mágicamente un objeto contenedor cuando empiezas a asignarle atributos, y si matlab lo permite, consideraría que el matlab está muy roto. Considere esto:

person.name = "Mike" 
persom.age = 25 
person.sex = "Male" 

Ahora tenemos dos objetos, person y persom, y person no tiene age, y no había ningún indicio de que esto ocurriera. Más tarde intenta imprimir person.age y, uno esperaría, matlab luego se queja ... dos páginas después del error real.

Una clase se puede usar como contenedor o espacio de nombres. No hay necesidad de crear una instancia, y te ahorrará un poco de tipeo si solo quieres un conjunto de atributos.

class sex: 
    male = "M" 
    female = "F" 

class person: 
    name = "Mike" 
    age = 25 
    sex = sex.male 

Para acceder o modificar cualquiera de estos, se puede utilizar person.name, etc.

N. B. También utilicé una clase para sex para ilustrar uno de los beneficios de hacerlo: proporciona consistencia en los valores de los datos (sin recordar si usaste "M" o "Hombre" o "masculino") y capta los errores tipográficos (es decir, Python se quejará) sobre sex.mlae pero no sobre la cadena "mlae" y si más tarde lo compara con "masculino", este último fracasaría).

Por supuesto, aún corre el riesgo de escribir incorrectamente name, age, o sex en este tipo de definición de clase. Entonces, lo que puedes hacer es usar la clase como plantilla y crear una instancia.

class Person: 
    def __init__(self, name, age=None, sex=None): 
     self.name, self.age, self.sex = name, age, sex 

Ahora, cuando lo hace:

person = Person("Mike", 25, sex.male) 

o si desea documentar lo que todos los parámetros son:

person = Person("Mike", age=25, sex=sex.male) 

es prácticamente imposible terminar con un objeto que tiene un nombre de atributo mal escrito. Si lo arruinas, Python te dará un mensaje de error en el momento en que cometiste el error. Esa es solo una razón para hacerlo de esta manera.

+0

Tu última sugerencia es la mejor. Con el segundo, puede estropear el orden, p. 'persona = Persona (" Mike ", sex.male, 25)' –

+0

Gracias kindall. Tu explicación es clara y muy útil. Estoy de acuerdo en que es un error que se encuentra comúnmente en matlab. Si puedo describir un poco por qué hice la pregunta. Siendo nuevo en Python, todavía pienso en matlab. El problema que tengo es que tengo una función que tomará múltiples entradas (más de 40), así que en lugar de tener la función (entrada1, entrada2, ..., entrada40), tendré la función (entrada) donde la entrada consiste en input.1, input.2, .., input.40. Mi solución matlab-céntrica podría no ser posible en Python y podría tener que replantear la solución. Gracias – mikeP

+0

Puede intentar agregar cada entrada a una lista y acceder a cada valor de entrada por el índice de la lista. El orden sería importante, sin embargo, y no es una solución tan flexible como las anteriores. – Michael0x2a

3

es probable que desee un diccionario (hachís, matriz asociativa):

person = {'name': 'Mike', 'age': 25} 
7

En Python, person Tiene que haber una instancia de alguna clase; no puede simplemente materializarse de la nada.

Se podría lograr algo similar a su código de este modo:

class Struct(object): pass 

person = Struct() 
person.name = 'Mike' 
person.age = 25 
person.gender = 'male' 

print(person.__dict__) 

Esta impresora:

{'gender': 'male', 'age': 25, 'name': 'Mike'} 
11

En Python se puede agregar miembros dinámicamente a una clase existente, pero ese nombre debe ser conocida ser del tipo de alguna clase. Para ello puede crear una clase vacía:

class Empty: 
    pass  # empty statement otherwise the class declaration cannot succeed 

construir su variable como una instancia del mismo

person = Empty() 

y luego añadir todos los datos que desea

person.name = 'Mike' 
person.age = 25 
person.gender = 'male' 

Por otra parte , si no necesita las características adicionales que proporciona una clase "normal" y solo quiere almacenar algunos datos en un valor de clave =>, puede usar un diccionario.

person={} 
person['name']='Mike' 
person['age']=25 
person['gender']='male' 

(Nótese que, al menos hasta Python 2.7, esto es más que nada una diferencia estilística, ya que las clases son implementados por debajo en términos de los diccionarios)

0

Si bien recomendaría NPE o Matteo como el método preferido, ya que las funciones son objetos de primera clase en python, también se pueden usar para emular una clase vacía, pero no se pueden instanciar como objetos múltiples (por lo que solo tendría una instancia de objeto por función).

>>> def person():pass 
... 
>>> person.name = 'Mike' 
>>> person.name 
'Mike' 
>>> person 
<function person at 0x020CF2F0> 

Es raro, por lo que no recomendaría el uso de este, pero ilustra que las funciones son objetos de primera clase en Python.

Cuestiones relacionadas