運(yùn)行下面的代碼是否會(huì)報(bào)錯(cuò),如果報(bào)錯(cuò)請說明哪里有什么樣的錯(cuò),如果不報(bào)錯(cuò)請說出代碼的執(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)評:這道題有兩個(gè)考察點(diǎn)
一個(gè)考察點(diǎn)是對_和__開頭的對象屬性訪問權(quán)限以及@property裝飾器的了解
另外一個(gè)考察的點(diǎn)是對動(dòng)態(tài)語言的理解,不需要過多的解釋。
擴(kuò)展:如果不希望代碼運(yùn)行時(shí)動(dòng)態(tài)的給對象添加新屬性,可以在定義類時(shí)使用__slots__魔法。
例如,我們可以在上面的A中添加一行__slots__ = ('__value', ),再次運(yùn)行上面的代碼,將會(huì)在原來的第10行處產(chǎn)生AttributeError錯(cuò)誤。