2010-01-19 3 views
23

В C# я бы:Как объявить атрибут в Python без значения?

string UserName; 
string Password; 

Но теперь, в Python:

class User: 
    UserName 
    Password 

Я получаю сообщение об ошибке, UserName не определен. Могу ли я объявить переменную без переменной?

+0

Учебник Python находится здесь: http://docs.python.org/tutorial/index.html Это очень хорошо, если вы уже делали программирование раньше. –

+1

Зачем вам это нужно? – sykora

+0

Фраза «без переменной», вероятно, должна была быть «без значения». –

ответ

41

В Python и многих других языках существует значение, которое означает «no value». В Python это значение равно None. Таким образом, вы могли бы сделать что-то вроде этого:

class User: 
    UserName = None 
    PassWord = None 

Те уверены, что звук, как переменные экземпляра, хотя и не переменные класса, так что, возможно, сделать это:

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

Обратите внимание, как Python присваивает значение None неявно от времени времени:

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

Привет, спасибо за ответ. Несколько вопросов, почему, почему вы помещаете (объект) в конец имени класса? Кроме того, что такое def __init__? Если у вас хорошая ссылка, это будет здорово. –

+0

@Sergio Tapia: Посмотрите на это: http://stackoverflow.com/questions/54867/old-style-and-new-style-classes-in-python –

+0

Расширение 'object' в Python является своего рода синтаксическим взломом, хотя чрезвычайно распространенный, что означает, что вы хотите использовать классы нового стиля. Если вы используете Python 2.x, вы должны привыкнуть к этому. '__init__' является конструктором python. – Triptych

11

Прежде всего, вы должны переписать так:

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

Таким образом, имя пользователя и пароль переменные экземпляра вместо переменных класса (в вашем примере, они являются переменными класса - все переменные экземпляра должны определяется в __init__ как свойства self). Затем вы можете инициализировать User с любым именем пользователя и паролем, включая None, если вы действительно хотите, чтобы у них не было никакой ценности.

+1

И, если вы считаете, что хотите «объявить» атрибут, вы не можете. Однако вы можете назначить «Нет», чтобы создать атрибут. –

2

Просто присвоить значение None:

self.username = None

+0

Да, вы правы. Но ответ уже выбран. –

+0

Это помогает говорить положительно. Если вы сомневаетесь, запустите простейший тест, чтобы получить подтверждение. Вы можете (и можете) продолжать получать возвышения долго после того, как был принят ответ. –

+0

Спасибо, что нажали S.Lott. Я протестировал его и обновил свой ответ. –

5

Вы не можете. В Python «Переменные» - это просто имена. Имя всегда указывает («привязано») к объекту. Согласие назначать имена, которые еще не имеют разумного значения, но должны присутствовать, до None.

Возможно, вас также заинтересует мой answer here.

+0

+1. Всегда хорошо напоминать людям, что «присвоение ценности» в Python является немного сомнительной концепцией. – Triptych

5

В коде:

class User: 
    UserName 
    Password 

UserName и Password обрабатываются как выражения. Так как они не были назначены на данный момент, вы получаете NameError.

В Python переменная должна быть определена с помощью инструкции присваивания, прежде чем ее можно будет использовать в выражении, иначе вы получите NameError. Обратите внимание, что «before» здесь означает «порядок выполнения», а не «порядок исходного кода». Это немного больше (импорт операторов, глобалы, хакеры пространства имен), но давайте оставим это здесь просто.

Идиоматический способ определения переменной «без значения» - присвоить ей значение None.

Кроме того, ваш код выглядит так, как будто он действительно хочет членов экземпляра, а не членов класса.Идиоматический способ сделать это, как это было признан некоторыми инструментами статического анализа, таких как pylint, является:

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

Кроме того, это хороший стиль Python, чтобы получить все классы от «объекта», так что вы используете классы нового стиля , и для того чтобы назвать переменную экземпляра с нижним регистром case_with_underscore или initialLowerWithCaps. Стиль InitialCaps довольно универсален для имен классов.

Смежные вопросы