我有一個類 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__:我最終得到了一個無限遞回錯誤。如何訪問包含實體變數的字典?
uj5u.com熱心網友回復:
您應該__slots__改為使用將屬性限制為僅您想要的屬性。
https://docs.python.org/3/reference/datamodel.html#slots
__slots__允許我們顯式宣告資料成員(如屬性)并拒絕創建__dict__和__weakref__(除非__slots__在父級中明確宣告或可用。)
[...] 如果沒有
__dict__變數,則無法為實體分配__slots__定義中未列出的新變數。嘗試分配給未列出的變數名稱會引發AttributeError. [...]
所以基本上在你的班級中添加這個,最好在頂部的某個地方(就class在行之后和初始化之前):
__slots__ = 'num', 'denom'
并洗掉您的 setattr :)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/327272.html
