運(yùn)行下面的代碼是否會(huì)報(bào)錯(cuò),如果報(bào)錯(cuò)請(qǐng)說(shuō)明哪里有什么樣的錯(cuò),如果不報(bào)錯(cuò)請(qǐng)說(shuō)出代碼的執(zhí)行結(jié)果。
class A: def __init__(self, value): self.__value = value @property def value(self): return self.__value obj = A(1) obj.__value = 2 print(obj.value) print(obj.__value)
點(diǎn)評(píng):這道題有兩個(gè)考察點(diǎn)
一個(gè)考察點(diǎn)是對(duì)_和__開(kāi)頭的對(duì)象屬性訪問(wèn)權(quán)限以及@property裝飾器的了解
另外一個(gè)考察的點(diǎn)是對(duì)動(dòng)態(tài)語(yǔ)言的理解,不需要過(guò)多的解釋。
擴(kuò)展:如果不希望代碼運(yùn)行時(shí)動(dòng)態(tài)的給對(duì)象添加新屬性,可以在定義類(lèi)時(shí)使用__slots__魔法。
例如,我們可以在上面的A中添加一行__slots__ = ('__value', ),再次運(yùn)行上面的代碼,將會(huì)在原來(lái)的第10行處產(chǎn)生AttributeError錯(cuò)誤。