【问题标题】:How to continue calling __init__ funtion until certain condition meet?如何继续调用 __init__ 函数直到满足某些条件?
【发布时间】:2021-12-10 16:23:15
【问题描述】:

以下面的代码为例。

import random
class test:
    def __init__(self):
        x = random.choice([1,2,3])
        print(x)
        if x == 2:
            pass

我在这里要做的是,当 x 等于 2 时,再次运行该函数并获得不同的 x 值。因此,每当我调用 test 类时,它总是分配 x 值而不是 2。

注意:我们必须在 __init__ 中运行 random.choice() 并始终获得 2 以外的值,可以根据需要多次运行 __init__,除非我们得到不同的价值。 x 的值是随机的。

我尝试过的

class test:
    def __init__(self):
        x = random.choice([1,2,3])
        if x != 2:
            self.x = x
        else:
            test()

【问题讨论】:

  • 我认为你不应该调用 __init__ 递归。但是while循环怎么样?而且,如果您不想要 2,您当然可以将其从选项列表中删除另一个选项是围绕对象的创建创建循环
  • 是的,while 循环运行顺利。我知道不应该使用__init__ 递归。我只是想知道如何执行这样的任务。虽然从选项列表中删除值不是选项哈哈

标签: python loops init


【解决方案1】:

更新: 实现 while 循环听起来是个好主意。 试试这个:

import random
class test:
    def __init__(self):
        x = random.choice([1,2,3])
        loop = 0
        while x == 2:
            x = random.choice([1,2,3])
            loop += 1
            if loop >= 5:
                x = False

不可能从 __init__() 函数返回任何值,因为该函数应该返回 None,因此我将 x 值设置为 False,如果您想要的话,

【讨论】:

  • 我喜欢这个答案,我认为它有效,但我建议将这种功能放在它自己的方法中。 init 方法旨在只运行一次,并且大多数情况下它不应包含任何可能永远运行的内容,因为初始化不会完成。如果你要从这个类继承并在孩子的 init 上运行 super,它可能会卡住。
  • 感谢您的回答!我真的很想知道我们可以在这里设置限制。例如,代码最多执行5次,得到2以外的值,如果没有找到则返回FALSE
  • 抱歉回复晚了,我已经更新了代码,请看一下!
【解决方案2】:

你真的不想递归地调用 init。如果您使用的是 Python 3.8+,那么有一种巧妙的方法可以满足您的要求。

class test:
  def __init__(self):
    while (x := random.choice([1,2,3])) == 2:
      pass

在某个时候,while 循环会在 x 为 1 或 3 时终止

【讨论】:

  • 嗯...我喜欢这个答案。我之前没有见过:= 的用例。但我相信它有助于python同时理解两个等号。
  • 就是所谓的“海象算子”。阅读它here
猜你喜欢
  • 2019-12-23
  • 2021-11-26
  • 1970-01-01
  • 2019-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-11
相关资源
最近更新 更多