在C#中我会去:
string UserName;
string Password;
但现在,在Python中:
class User:
UserName
Password
我收到UserName
未定义的错误。我不能在没有变量的情况下声明变量吗?
答案 0 :(得分:57)
在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
答案 1 :(得分:12)
首先,你应该像这样重写:
class User(object):
def __init__(self, username, password):
self.username = username
self.password = password
这样,用户名和密码是实例变量而不是类变量(在您的示例中,它们是类变量 - 所有实例变量都需要在__init__
中定义为self
的属性)。然后,您可以使用您想要的任何用户名和密码初始化User
,包括None
,如果您确实希望它们没有价值。
答案 2 :(得分:7)
在您的代码中:
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样式非常普遍地保留给类名。
答案 3 :(得分:5)
你做不到。在Python中,“变量”只是名称。名称始终指向(“绑定”)对象。惯例是将名称尚未具有合理价值但应该存在的名称分配给None
。
您可能也对我的answer here感兴趣。
答案 4 :(得分:2)
只需指定None
:
self.username = None
答案 5 :(得分:0)
@dataclass
class User:
UserName: str
Password: str