Как мне объявить атрибут в Python без значения? - PullRequest
33 голосов
/ 19 января 2010

В C # я бы сказал:

string UserName;
string Password;

Но теперь в Python:

class User:
    UserName
    Password

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

Ответы [ 6 ]

58 голосов
/ 19 января 2010

В Python и многих других языках есть значение, которое означает «нет значения».В 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
12 голосов
/ 19 января 2010

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

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

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

7 голосов
/ 19 января 2010

В вашем коде:

class User:
    UserName
    Password

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

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

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

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

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

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

5 голосов
/ 19 января 2010

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

Вас также может заинтересовать мой ответ здесь .

2 голосов
/ 19 января 2010

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

self.username = None

1 голос
/ 26 апреля 2019

Классы данных для Python 3.7 + :

@dataclass
class User:
    UserName: str
    Password: str
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...