当前位置: 首页 > 面试题库 >

如何在Python中声明实例变量的默认值?

阎星河
2023-03-14
问题内容

我应该给班级成员这样的默认值吗?

class Foo:
    num = 1

还是这样?

class Foo:
    def __init__(self):
        self.num = 1

在这个问题中,我发现在两种情况下

bar = Foo()
bar.num += 1

是一个定义明确的操作。

我知道第一个方法会给我一个类变量,而第二个方法则不会。但是,如果我不需要类变量,而只需要为实例变量设置默认值,那么这两种方法是否一样好?还是其中一个比另一个更“
pythonic”?

我注意到的一件事是,在Django教程中,他们使用第二种方法声明模型。我个人认为第二种方法更优雅,但是我想知道什么是“标准”方法


问题答案:

扩展bp的答案,我想向您展示他所说的不可变类型的含义。

首先,这没关系:

>>> class TestB():
...     def __init__(self, attr=1):
...         self.attr = attr
...     
>>> a = TestB()
>>> b = TestB()
>>> a.attr = 2
>>> a.attr
2
>>> b.attr
1

但是,这仅适用于不可变(不变)类型。如果默认值是可变的(意味着可以替换),则将发生这种情况:

>>> class Test():
...     def __init__(self, attr=[]):
...         self.attr = attr
...     
>>> a = Test()
>>> b = Test()
>>> a.attr.append(1)
>>> a.attr
[1]
>>> b.attr
[1]
>>>

请注意,两者ab都有共享属性。这通常是不需要的。

当类型可变时,这是定义实例变量默认值的Python方法:

>>> class TestC():
...     def __init__(self, attr=None):
...         if attr is None:
...             attr = []
...         self.attr = attr
...     
>>> a = TestC()
>>> b = TestC()
>>> a.attr.append(1)
>>> a.attr
[1]
>>> b.attr
[]

我的第一段代码起作用的原因是,对于不可变的类型,Python会在需要时创建它的新实例。如果需要将1加1,Python会为您创建一个新的2,因为旧的1无法更改。我相信,原因主要是散列。



 类似资料:
  • 本文向大家介绍Python实例变量的默认值,包括了Python实例变量的默认值的使用技巧和注意事项,需要的朋友参考一下 示例 如果变量包含不可变类型的值(例如字符串),则可以分配这样的默认值 在初始化可变对象(例如构造函数中的列表)时,需要小心。考虑以下示例: 此行为是由于以下事实引起的:在Python中,默认参数是在函数执行时绑定的,而不是在函数声明时绑定的。要获得实例之间不共享的默认实例变量,

  • 问题内容: 如何在mysql中声明变量,以便第二个查询可以使用它? 我想写一些像: 问题答案: MySQL中主要有三种类型的变量: 用户定义的变量 (以开头): 您可以访问任何用户定义的变量,而无需对其进行声明或初始化。如果引用的变量尚未初始化,则其值为和字符串类型。 您可以使用或语句来初始化变量: 要么 可以从一组有限的数据类型中为用户变量分配一个值:整数,十进制,浮点数,二进制或非二进制字符串

  • 问题内容: 我有一个Netezza查询,在其中我引用了一系列案例陈述中的几个日期。而不是每次我都想在开始时将一个变量置为一个变量并在整个查询中都使用它时,而不是替换所有这些日期。在SAS中,我会这样做: 问题答案: 不幸的是,Netezza中没有程序SQL扩展,您无法将这样的变量用作SQL语言本身的一部分。纯粹的SQL解决方案将涉及一些麻烦,例如加入CTE并返回该值。但是,NZSQL CLI确实允

  • 问题内容: 学习Python,并且有一些基本的疑问。 1.我已经看到变量声明(这里的路径)为 有时,没有显式声明,而是通过进行初始化。 我了解的目的,但建议在其他任何函数中声明变量。 2.如何创建变量以保存自定义类型? 问题答案: 好的,首先是第一件事。 Python中没有“变量声明”或“变量初始化”之类的东西。 我们简单地将其称为“分配”,但可能应该仅将其称为“命名”。 赋值的意思是“现在此名称

  • 问题内容: 我读到Java为类属性提供了默认值,但没有为局部变量提供默认值。那是对的吗?如果是这样,背后的原因是什么?当您做某件事时,为什么不一直这样做呢? 谢谢你, 罗杰 问题答案: 标准局部变量存储在堆栈中,直到初始化后才真正创建。如果未使用局部变量,则它不会进入堆栈。但是,成员变量在堆中分配,因此具有默认的占位符(空引用或默认原语)。

  • 问题内容: 我有以下模板: 并最终以: 有办法吗? 问题答案: 更新资料 我们可以像这样创建指令并调用它 ng-var.directive.ts 通过此指令,我们可以使用以下命令 要么 要么 要么 原始答案 角v4 1)+ + 2)+ + 视图 component.ts 3)如果您不想创建包装器,可以使用 视图 正如@基思在评论中提到的 这在大多数情况下都可以使用,但这不是通用解决方案,因为它依赖