【问题标题】:Factory Reset of a class instance类实例的出厂重置
【发布时间】:2021-10-25 21:36:21
【问题描述】:

我有一个 Python 代码,其结构如下:

for i in range (0,N):
    ClassInstance = A(params)
    ... #some operation that modify the attribute of the instance "ClassInstance" of the class "A"

A 是一个类,通过类组合关系链接到另一个类。

现在我想在每个循环中重置类的实例并且:

  • 我不想为每个周期创建一个具有不同名称的新实例
  • 我不想在A 中编写用于手动 重置属性的方法,因为它们很多且并非全部在__init__ 方法中定义,而是分布在各种方法中班级。

我只希望在每个循环中,相同的旧实例都呈现出刚刚创建后的相同状态;为此,我将继续在A 中放置一个重置方法,如下所示:

def reset(self, params):
    self = A(params)

并修改代码结构如下:

ClassInstance = A(params)
for i in range (0,N):
    ClassInstance.reset(params)
    ... #some operation that modify the attribute of the instance "ClassInstance" of the class "A"

忘记 ClassInstance 以前的历史记录,在每个周期从 0 重新开始,这是一种安全的方法,还是有一些我没有考虑的缺点?

附: 在线搜索我看到了一些以前的类似帖子(如Preferred way of resetting a class in Python),但我想了解这种特定方式是否有效,以及在继续进行时我是否应该小心某些事情。 显然,如果这种方法是解决我的问题的错误方法,那么适合我情况的其他方法/解决方案也很受欢迎(但在这种情况下,我想了解问题出在哪里)

【问题讨论】:

  • 就我完全可以理解的问题而言,您似乎在问一个关于编程风格的主观问题 - is off topic here
  • 嗨,卡尔,我不会这么说;我不确定这种方法的正确性,所以我要求更好地理解它。如果该方法是错误的,那么适合我情况的不同方法肯定也会被接受;无论如何,谢谢你的评论,我会在我的问题结束时澄清这一点
  • 创建一个新实例几乎肯定会更好。你不需要一个不同的名字。原始代码块中的代码运行良好。
  • 所以第二次调用该类将重置所有因为这是我第一次调用它?

标签: python class initialization instance reset


【解决方案1】:

您必须了解= 运算符在分配给a=obj 等变量时的作用

这不会修改变量指向的对象。这只是设置变量将从那时起引用哪个对象,而不再理会旧对象。

所以ClassInstance = A()创建一个新对象并将其分配给变量ClassInstance

旧实例不再被引用,您无法再访问它。所以在每个循环中你都有一个新的实例。

此外,您不能通过执行self = A() 来重置实例您正在将一个新对象分配给局部变量selfself 引用的实例未被触及。而且,当方法返回时,self变量被释放,实例不再被引用,因此被销毁。

通常分配给变量不会做任何事情。就像给对象贴标签一样。 self 是一个和其他变量一样的变量。没什么特别的。

重置实例的唯一方法是手动设置其属性。

('object'和'instance'在这个上下文中的意思是一样的)

顺便说一句,你不能在 python 中实际销毁对象。例如,您可以使用del a 删除变量,但对象在不再被引用时会自动销毁。

【讨论】:

  • 谢谢你,很抱歉这个愚蠢的问题;因此,通过在每个循环中使用ClassInstance = A(params) 创建一个新对象,我不必重新初始化类变量,因为它们包含在不再引用的旧实例中;我会自动为变量获取相同的初始值,对吧?
  • 是的。每个新实例总是在创建后初始化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-05
  • 1970-01-01
  • 1970-01-01
  • 2016-11-14
相关资源
最近更新 更多