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

Ser*_*pia 34 python class

在C#我会去:

string UserName;
string Password;
Run Code Online (Sandbox Code Playgroud)

但现在,在Python中:

class User:
    UserName
    Password
Run Code Online (Sandbox Code Playgroud)

我收到一个UserName未定义的错误.没有变量我可以声明变量吗?

Tri*_*ych 60

在Python和许多其他语言中,有一个值意味着"没有价值".在Python中,该值是None.所以你可以这样做:

class User:
   UserName = None
   PassWord = None
Run Code Online (Sandbox Code Playgroud)

那些肯定听起来像实例变量,而不是类变量,所以也许这样做:

class User(object):
    def __init__(self):
        self.UserName = None
        self.PassWord = None
Run Code Online (Sandbox Code Playgroud)

请注意Python如何None隐式地不时地分配值:

def f():
    pass
g = f() # g now has the value of None
Run Code Online (Sandbox Code Playgroud)

  • @SergioTapia 是的。请参阅 https://docs.python.org/2/tutorial/classes.html#class-and-instance-variables (2认同)
  • @Triptych Python 绝对不会“时不时地”分配 None 值。如果函数/方法不包含“return”语句,那么它_总是_返回“None”。我知道我这个评论迟到了 10 年,但也许它对某人仍然有用。 (2认同)

dan*_*ben 12

首先,你应该像这样重写:

class User(object):
  def __init__(self, username, password):
    self.username = username
    self.password = password
Run Code Online (Sandbox Code Playgroud)

这样,用户名和密码是实例变量而不是类变量(在您的示例中,它们是类变量 - 所有实例变量都需要__init__作为属性定义self).然后,您可以User使用您想要的任何用户名和密码初始化a ,包括None您是否真的希望它们没有价值.


dda*_*daa 8

在你的代码中:

class User:
    UserName
    Password
Run Code Online (Sandbox Code Playgroud)

UserName并被Password解析为表达式.由于此时尚未分配,因此您获得了NameError.

在Python中,必须先使用赋值语句定义变量,然后才能在表达式中使用它,否则会得到NameError.请注意,"之前"在这里表示"执行顺序",而不是"源代码顺序".还有一点(导入语句,全局变量,命名空间黑客),但让我们在这里保持简单.

定义变量"没有值"的惯用方法是为其赋值None.

此外,您的代码看起来确实需要实例成员,而不是类成员.正如一些静态分析工具所认识到的那样,惯用的方法pylint是:

class User(object):
    def __init__(self):
        self.username = None
        self.password = None
Run Code Online (Sandbox Code Playgroud)

此外,从"对象"派生所有类是很好的Python样式,因此您使用新样式类,并使用lowercase_with_underscore或initialLowerWithCaps约定命名实例变量.InitialCaps样式非常普遍地保留给类名.


val*_*ame 6

python 3.7+的数据类

@dataclass
class User:
    UserName: str
    Password: str
Run Code Online (Sandbox Code Playgroud)


bal*_*pha 5

你不能.在Python中,"变量"只是名称.名称始终指向("绑定")对象.通常的做法是指定尚未具有合理价值但应该存在的名称None.

您可能也对我的答案感兴趣.