2010-01-19 17 views
23

En C# Me gustaría ir:¿Cómo declaro un atributo en Python sin un valor?

string UserName; 
string Password; 

Pero ahora, en Python:

class User: 
    UserName 
    Password 

recibo un error que UserName no está definido. ¿No puedo declarar una variable sin una variable?

+0

El tutorial de Python está aquí: http://docs.python.org/tutorial/index.html Es bastante bueno si ya has hecho la programación. –

+1

¿Por qué querrías hacer eso? – sykora

+0

La frase "sin una variable" probablemente estaba destinada a ser "sin valor". –

Respuesta

41

En Python, y en muchos otros idiomas, hay un valor que significa "sin valor". En Python, ese valor es None. Por lo que podría hacer algo como esto:

class User: 
    UserName = None 
    PassWord = None 

Aquellos seguro de sonido como variables de instancia sin embargo, y no variables de clase, así que tal vez hacer esto:

class User(object): 
    def __init__(self): 
     self.UserName = None 
     self.PassWord = None 

Nota cómo Python asigna el valor None implícita de vez a tiempo:

def f(): 
    pass 
g = f() # g now has the value of None 
+0

Hola, gracias por la respuesta. Un par de preguntas, ¿por qué pones (objeto) al final del nombre de la clase? Además, ¿qué es def __init__? Si tienes un buen enlace, será genial. –

+0

@Sergio Tapia: vea esto: http://stackoverflow.com/questions/54867/old-style-and-new-style-classes-in-python –

+0

extendiendo 'object' en Python es una especie de truco sintáctico, aunque una muy común, eso quiere decir que quieres usar clases de estilo nuevo. Si usa Python 2.x, debe tener el hábito de hacerlo. '__init__' es un constructor de python. – Triptych

11

En primer lugar, debe volver a escribir así:

class User(object): 
    def __init__(self, username, password): 
    self.username = username 
    self.password = password 

De esta forma, nombre y contraseña son variables de instancia en lugar de las variables de clase (en el ejemplo, son variables de clase - todas las variables de instancia necesitan se definirá en __init__ como propiedades de self). Luego, puede inicializar un User con el nombre de usuario y la contraseña que desee, incluido None si realmente desea que no tengan ningún valor.

+1

Y, si crees que quieres "declarar" un atributo, no puedes. Sin embargo, puede asignar 'None' para que pueda crear un atributo. –

2

Basta con asignar el valor de None:

self.username = None

+0

Sí, tiene razón. Pero la respuesta ya ha sido seleccionada. –

+0

Ayuda a hablar positivamente. En caso de duda, ejecute la prueba más simple para obtener la confirmación. Puede (y puede) continuar recibiendo votos ascendentes mucho después de que se haya aceptado una respuesta. –

+0

Gracias por empujar a S.Lott. Lo probé y actualicé mi respuesta. –

5

No puede. En Python, "Variables" son solo nombres. Un nombre siempre apunta ("está vinculado") a un objeto. Es una convención asignar nombres que aún no tienen un valor razonable, pero deben estar presentes, en None.

También le puede interesar answer here.

+0

+1. Siempre es bueno recordarle a la gente que "asignar valor" a Python es un concepto un tanto dudoso. – Triptych

5

En su código:

class User: 
    UserName 
    Password 

UserName y Password son interpretados como expresiones. Como no han sido asignados en este punto, obtienes un NameError.

En Python, una variable debe definirse con una declaración de asignación antes de poder usarse en una expresión, de lo contrario se obtiene un NameError. Tenga en cuenta que "antes" aquí significa "orden de ejecución", no "orden de código fuente". Hay un poco más de eso (instrucciones de importación, globales, hacks de espacio de nombres), pero vamos a hacerlo simple aquí.

La manera idiomática de definir una variable "sin un valor" es asignarle el valor None.

Además, su código parece que realmente quiere miembros de la instancia y no miembros de la clase.La forma idiomática para hacerlo, como se reconoce en algunas herramientas de análisis estático tales como pylint, es:

class User(object): 
    def __init__(self): 
     self.username = None 
     self.password = None 

Además, es un buen estilo de Python para derivar todas las clases de "objeto", por lo que utilizar las clases de nuevo estilo y para nombrar la variable de instancia con la convención lowercase_with_underscore o initialLowerWithCaps. El estilo de InitialCaps está universalmente reservado a los nombres de las clases.

Cuestiones relacionadas