【问题标题】:kernel dies after @property in python内核在python中的@property之后死亡
【发布时间】:2022-12-17 12:12:30
【问题描述】:

我在 Jupyter 中运行以下代码:

from typing import List

class dummy:
    def __init__(self, dum: List =[]):
        self.dum = dum

    @property
    def dum(self) -> List:
        return self.dum

    @dum.setter
    def dum(self, value: List) -> None:
        self.dum = value

当我运行以下命令时:

dummy(dum=[1,2,3])

内核在没有告诉我很多可能的错误的情况下就死了。到底是怎么回事?

【问题讨论】:

  • 您不应该将类的方法和属性命名为相同的名称。 dum同时是一个方法和一个属性,所以dummy().dum很容易混淆。重命名属性应该可以解决问题。
  • 内核死了有没有告诉你任何事情?如果是这样,发帖会很有帮助。未来的搜索者更有可能在其中找到这个问题。
  • 从命令行运行失败的脚本以查看会发生什么会很有用。在这里你会得到self.dum = valueRecursionError: maximum recursion depth exceeded

标签: python jupyter-lab


【解决方案1】:
@property
def dum(self) -> List:
    return self.dum

这创建了一个无限递归。

from typing import List

class dummy:
    def __init__(self, dum: List = None):
        self.dum = dum if dum is not None else []

    @property
    def dum(self) -> List:
        return self._dum

    @dum.setter
    def dum(self, value: List) -> None:
        self._dum = value

【讨论】:

  • 使用__init__ 中的属性仍然可以,而不是直接使用._dum。 (从某种意义上说,_num 属性是财产,而不是dummy。)也可以说仍然检查dum is None是否更好。调用者可能有理由将一个明确的空列表作为参数传递,而不希望 __init__ 将其替换为新的空列表。
  • @chepner 完全同意,谢谢
猜你喜欢
  • 2018-12-11
  • 1970-01-01
  • 2022-11-27
  • 2017-08-11
  • 2022-01-24
  • 1970-01-01
  • 2020-04-06
  • 2020-03-12
  • 1970-01-01
相关资源
最近更新 更多