如何在没有值的情况下在Python中声明属性?

时间:2010-01-19 15:40:23

标签: python class

在C#中我会去:

string UserName;
string Password;

但现在,在Python中:

class User:
    UserName
    Password

我收到UserName未定义的错误。我不能在没有变量的情况下声明变量吗?

6 个答案:

答案 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

UserNamePassword被解析为表达式。由于此时尚未分配,因此您获得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)

Dataclasses for python 3.7+

@dataclass
class User:
    UserName: str
    Password: str