【发布时间】:2021-10-20 07:19:17
【问题描述】:
我有一个 Fraction 类,它的 init 创建实例变量 self.num = num 和 self.denom=denom:
def __init__(self,num=0,denom=1):
assert isinstance(num, int), "Numerator and denominator must be an integer"
assert isinstance(denom, int), "Numerator and denominator must be an integer"
assert denom != 0, "Denominator cannot be 0."
self.num = num
self.denom = denom
我正在尝试编写它的__setattr__ 方法,以禁止通过引发 NameError 初始化实例变量后对其进行更改:
def __setattr__(self,name,value):
if name not in Fraction.__dict__:
self.__dict__[name] = value
else:
raise NameError
通过打印Fraction.__dict__,我可以看到 dict 包含 Fractions 方法,而不是 num、denom 及其各自的值。所以我然后尝试这样做:if name not in Fraction().__dict__:,我最终遇到了无限递归错误。如何访问包含实例变量的字典?
【问题讨论】:
-
听起来你想要
self.__dict__在if中,而不仅仅是在以后的作业中。 -
成员
num和denum绑定到您的类的实例。因此,您必须使用self.__dict__而不是Fraction.__dict__。 -
你也可以使用 drozen 数据类。
-
啊,我不敢相信我忽略了这一点。标记的答案和这些 cmets 都以不同的方式解决了我的问题。谢谢大家。