【问题标题】:Replace class instance with function inside the class (python)用类内的函数替换类实例(python)
【发布时间】:2020-06-19 09:12:27
【问题描述】:

我想用一个新实例替换类实例“模型”。 这应该发生在类内的重置函数中。我可以轻松地在类外执行model = Model(number = 2),但这不是我需要的。

对你来说,数字只是一个简单的例子。我的实际任务完全不同。 总而言之,我需要创建一个同名的新实例,因为我需要重新运行 __init__。这必须发生在重置函数中。我希望你明白我的意思。不幸的是,我的reset 函数不起作用:

class Model():
    def __init__(self, number):
        self.number = number

    def reset(self):
        self = Model(number = 2)

model = Model(number = 1)
print(model.number) #it is 1

model.reset()
print(model.number) #it is 1 aswell, should be 2 :(

【问题讨论】:

  • 您不能更改对象的身份,如果这是您所要求的。您可以改变您的对象以具有相同的相关值,在这种情况下,reset 只需执行self.number=2。但是,为什么 mode = Model(2) 不是您所需要的呢?
  • 您刚刚将新创建的实例分配给局部变量self。您不能在原地用另一个对象替换对象。你reset 真的应该通过设置它的属性来将实例设置为它想要的/初始状态。

标签: python python-3.x class


【解决方案1】:

你不能在你的班级之外重新分配自己,但你可以这样做:

class Model():
    def __init__(self, number):
        self.number = number

    def reset(self):
        self.__dict__ = Model(number = 2).__dict__

model = Model(number = 1)
print(model.number) #it is 1

model.reset()
print(model.number) #it is 2 :)

阅读更多关于dict属性here

【讨论】:

  • 调用__init__ 方法怎么样?
  • 这不是创建一个新实例,这可能很重要。
  • 为什么要这样做?为什么不只是self.number = 2。请注意,这会破坏共享密钥命名空间字典...
【解决方案2】:

这里怎么样?是否允许在reset函数中运行init手册?

class Model():
    def __init__(self, number):
        self.number = number

    def reset(self):
        self.__init__(2)

model = Model(number = 1)
print(model.number) #it is 1

model.reset()
print(model.number) #it is 2 now

【讨论】:

    【解决方案3】:

    我想用一个新实例替换类实例“模型”。

    您所要做的就是重新绑定名称model

    使用

    model = Model(number=2)
    

    model = Model(model.number + 1)
    

    如果你想在实例化时自动增加number,你可以使用这样的东西:

    class Model:
        counter = 1
    
        def __init__(self):
            self.number = Model.counter
            Model.counter += 1
    

    【讨论】:

      猜你喜欢
      • 2020-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-08
      • 1970-01-01
      相关资源
      最近更新 更多