目录
- 一、访问控制的本质:数据安全与接口设计
- 1.1 类属性和方法的访问控制
- 1.2 类专有的方法
- 二、访问器模式的现代写法(@property进阶)
- 三、总结
一、访问控制的本质:数据安全与接口设计
1.1 类属性和方法的访问控制
一般情况下,我们会使用 __private_attrs 两个下划线开头,声明该属性为私有,不能在类地外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrspython作为动态语言,打破了传统OOP语言对访问控制的刚性限制。同理类方法的访问控制与属性一样。
class Student:
def __init__(self, score, name):
self.name = name # 公有属性, 可以直接被访问
self.__score =http://www.devze.com score # 私有属性, 不能被直接访问,但是可以通过双下划线实现Name Mangling访问
def get_score(self): # 公有方法, 可以直接被访问
return self.__score
def __get_score(self): # 私有方法, 不能被直接访问,但是可以通过双下划线实现Name Mangling访问
return self.__score
s = Student(100, 'Bob')
print(s.name) # 访问公有属性
print(s._Student__score) # 访问私有属性,Name Mangling
print(s.get_score()) # 访问公有方法
print(s._Student__get_score()) # 访问私有方法,Name Mangling
这段代码看似实现了信息隐藏,实际通过_Student__score仍可访问。这种"约定优于限制"的设计哲学,体现了Pythonic的核心思想。
1.2 类专有的方法
| 方法 | 说明 |
|---|---|
| __init__ | 构造函数,在生成对象时调用 |
| __del__ | 析构函数,释放对象时使用 |
| __repr__ | 打印,转换 |
| __setitem__ | 按照索引赋值 |
| __getitem__ | 按照索引获取值 |
| __len__ | 获得长度 |
| __cmp__ | 比较运算 |
| __call__ | 函数调用 |
| __add__ | 加编程运算 |
| __sub__ | 减运算 |
| __mul__ | 乘运算 |
| __div__ | 除运算 |
| __mod__ | 求余运算 |
| __pow__ | 乘方 |
当然有些时候我们需要获取类的相关信息,我们可以使用如下的方法:
type(obj):来获取对象的相应类型;isinstance(obj, type):判断对象是否为php指定的 type 类型的实例;hasattr(obj, attr):判断对象是否具有指定属性/方法;getattr(obj, attr[, default])获取属性/方法的值, 要是没有对应的属性则返回 default 值(前提是设置了 default),否则会抛出 AttributeError 异常;setattr(obj, attr, value):设定该属性/方法的值,类似于 obj.attr=value;dir(obj):可以获取相应对象的所有属性和方法名的列表
二、访问器模式的现代写法(@property进阶)
传统getter/setter模式:
class TemperatureSensor:
def gandroidet_temperature(self):
return self._raw_data * 0.8 - 5
def set_temperature(self, value):
if value < -273.15:
raise ValueError("Absolute zero violation")
self._raw_data = (value + 5)/0.8
sensor = TemperatureSensor()
sensor.set_temperature(20)
print(sensor.get_temperature())
现代Python推荐使用更优雅的@property装饰器:
class TemperatureSensor:
@property
def temperature(self):
return self._raw_data * 0.8 - 5
@temperature.setter
def temperature(self, value):
if value < -273.15:
raise ValueError("Invalid temperature")
self._raw_data = (value + 5)/0.8
sensor = TemperatureSensor()
sensor.temperature = 25
print(sensor.temperature)
实战技巧:在setter中可以加入类型检查、范围验证、历史记录等增强功能
三、总结
| 控制级别 | 定义方式 | 可访问范围 | 使用场景 |
|---|---|---|---|
| 公有成员 | name | 任意位置 | 对外暴露的完整接口 |
| 保护成员 | _name (单下划线) | 本类及子类 | 内部实现但允许继承扩展 |
| 私有成员 | __name | 本类内部 | 绝对私有防止外部干扰 |
到此这篇关编程客栈于一文带你搞懂Python类的访问控制的文章就介绍到这了,更多相关Python类访问控制内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!
加载中,请稍侯......
精彩评论