Getter和Setter是面向对象编程中用于控制属性访问的方法:
class MyClass:
def __init__(self, value):
self._readonly_value = value
@property
def readonly_value(self):
return self._readonly_value
# 使用
obj = MyClass(10)
print(obj.readonly_value) # 可以读取
obj.readonly_value = 20 # 会抛出AttributeError
const obj = {};
let internalValue = 10;
Object.defineProperty(obj, 'readonlyValue', {
get: function() {
return internalValue;
},
// 不定义setter使其只读
enumerable: true,
configurable: false
});
console.log(obj.readonlyValue); // 10
obj.readonlyValue = 20; // 静默失败或严格模式下报错
public class MyClass {
private final int readonlyValue;
public MyClass(int value) {
this.readonlyValue = value;
}
public int getReadonlyValue() {
return readonlyValue;
}
// 不提供setter方法
}
如果需要特殊情况下修改只读属性,可以通过以下方式:
obj._MyClass__readonly_value = 20 # 不推荐,破坏封装
Object.defineProperty(obj, 'readonlyValue', {
value: 20,
writable: true
});
Field field = MyClass.class.getDeclaredField("readonlyValue");
field.setAccessible(true);
field.set(obj, 20);
强行修改只读属性通常违反设计初衷,可能导致不可预期的行为,应谨慎使用。