gpt4 book ai didi

python - 调用对象属性时超出最大递归深度

转载 作者:行者123 更新时间:2023-11-28 16:23:59 24 4
gpt4 key购买 nike

我是 python 的新手,我决定创建一个模块来管理我的每月预算,以此作为学习机会。模块中的基本对象是借方,定义为

class Debit(object):

currency = "SEK"

def __init__(self,date,tag,ammount):
self.date = date
self.tag = tag
self.ammount = ammount

我希望能够控制正确输入该对象的属性,为此我尝试使用这样的属性

@property
def date(self):
return self.date
@date.setter
def date(self, d):
if len(d) == 0:
raise Exception("Date cannot be empty")
self.date = d

注意:date.setter 中的条件和异常将更改为更相关的内容,我只是想尝试一个异常这只起作用了一半:实际上,如果我尝试为日期输入一个空字符串,则会引发异常。但是,当我输入正确的日期然后尝试使用 .date 检索时,出现以下错误

RuntimeError: maximum recursion depth exceeded

我想我在属性和 setter 中命名“日期”时做错了什么,迫使 python 进入无限循环,但我真的无法理解它。

有什么帮助吗?

最佳答案

每个对象都有一个命名空间(实际上是一个 dict)来保存它的成员——不管它们是属性、函数/方法还是其他东西。

在您的例子中,您正尝试对方法原语 使用名称date。这会导致冲突,因此方法或原语都以名称 date 为人所知。

现在,如果 Debit.date 是常规方法,则在 __init__ 中设置 self.date = date 只会用值(value)。由于 Debit.date 是一个属性,它使用自定义行为来设置值 - self.date = date 不会替换该属性,而是调用它的 setter Debit .date.setter.

递归的出现是因为 setter 试图写入 self.date - 这又是属性,因此也尝试使用 Debit.date.setter

@date.setter  # makes the method available as `Debit.date`
def date(self, d):
if len(d) == 0:
raise Exception("Date cannot be empty")
self.date = d # sets `Debit.date`, i.e. calls `Debit.date.setter(self, d)`

正如在对您的问题的评论中所指出的,针对您的情况的常见方法是将属性 date属性 命名为_日期。这避免了名称冲突,但清楚表明两者属于同一类。

class Debit(object):
currency = "SEK"

def __init__(self,date,tag,ammount):
self.date = date # use of self.date calls the setter to set self._date with input checking
self.tag = tag
self.ammount = ammount

@property
def date(self): # property getter
return self._date # provide attribute

@date.setter
def date(self, d): # property setter
if len(d) == 0:
raise Exception("Date cannot be empty")
self._date = d # set attribute

关于python - 调用对象属性时超出最大递归深度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38101631/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com