python类的封装
时间: 2025-01-08 08:27:35 浏览: 3
### Python 类的封装概念
在面向对象编程中,封装是指将数据(属性)和操作这些数据的方法绑定在一起,并尽可能隐藏类内部的具体实现细节。这样可以保护对象的状态不被外部直接修改,从而提高程序的安全性和可维护性。
#### 属性隐藏
为了防止外部代码随意访问或更改对象的私有成员变量,在定义类时通常会采用一定的命名约定和技术手段来达到这一目的。例如:
- 使用双下划线前缀`__`声明私有属性;
- 提供公共接口方法用于间接存取器(setter/getter)方式控制对敏感字段的操作权限;
```python
class Person:
def __init__(self, name, age):
self.__name = name # 私有化名称属性
self.__age = age # 私有化年龄属性
def get_name(self):
return self.__name
def set_age(self, new_age):
if isinstance(new_age,int) and new_age>0:
self.__age=new_age
else:
raise ValueError('Invalid value')
p=Person("Alice",25)
print(p.get_name())
try:
p.set_age(-10)# 这里将会抛出异常因为传入了一个非法参数
except Exception as e :
print(e)
```
此段代码展示了如何利用 `get/set` 方法对外部提供安全的数据访问途径[^2]。
#### 单例模式下的封装实践
对于某些特殊场景下需要确保某个类仅有一个实例存在并允许其他模块方便获取该唯一实例的情况,则可以通过覆盖默认构造函数(`__new__()`)的方式实现单例模式。下面是一个简单的日志记录工具类作为案例说明:
```python
class SingletonLogger(object):
_instance = None
def __new__(cls,*args,**kwargs):
if not cls._instance:# 如果还没有创建过实例就新建一个
cls._instance = super().__new__(cls,*args,**kwargs)
return cls._instance
log1 = SingletonLogger()
log2 = SingletonLogger()
assert id(log1)==id(log2),"两个logger应该是同一个实例"
```
这里实现了当调用 `SingletonLogger()` 创建新对象时总是返回第一次生成的那个实例地址,以此保证整个应用程序生命周期内只会存在唯一的 logger 对象[^1]。
#### 数据抽象与接口设计
除了基本类型的简单组合外,更复杂的应用逻辑往往涉及到多个相互关联的对象之间的交互行为建模。此时就需要考虑良好地组织各个组件间的关系以及暴露给外界使用的 API 设计原则了。比如下面这个矩形面积计算的例子很好地体现了这一点:
```python
from abc import ABCMeta, abstractmethod
class Shape(metaclass=ABCMeta):
@abstractmethod
def area():pass
class Rectangle(Shape):
def __init__(self,length,breadth):
self.length=length
self.breadth=breadth
def area(self):
return (self.length*self.breadth)
rect =Rectangle(length=4,breadth=7)
print(f"The Area of rectangle is {rect.area()}")
```
上述代码片段遵循开闭原则(OCP),即软件实体应该对扩展开放而对其修改关闭。通过引入基类 shape 和其子类 rectangle 来构建层次结构体系,既保持了灵活性又增强了系统的稳定性和复用率[^4]。
阅读全文