构造函数的实际应用
现实世界中的构造函数继承模式
1. 数据库模型继承
class BaseModel:
def __init__(self, connection):
self.connection = connection
self.cursor = connection.cursor()
class UserModel(BaseModel):
def __init__(self, connection, table_name='users'):
super().__init__(connection)
self.table_name = table_name
def create_user(self, username, email):
query = f"INSERT INTO {self.table_name} (username, email) VALUES (%s, %s)"
self.cursor.execute(query, (username, email))
构造函数设计模式
初始化策略
模式 |
描述 |
使用场景 |
依赖注入 |
通过构造函数传递依赖项 |
松耦合 |
工厂方法 |
使用灵活的初始化方式创建对象 |
复杂对象创建 |
单例模式 |
确保只创建一个实例 |
资源管理 |
复杂继承示例
class NetworkConfig:
def __init__(self, host='localhost', port=8000):
self.host = host
self.port = port
class SecureNetworkConfig(NetworkConfig):
def __init__(self, host='localhost', port=8000, ssl_cert=None):
super().__init__(host, port)
self.ssl_cert = ssl_cert
self.secure_mode = ssl_cert is not None
def validate_connection(self):
return self.secure_mode
组合与继承
graph TD
A[基类] --> B[继承]
A --> C[组合]
B --> D[子类]
C --> E[组件类]
组合示例
class Logger:
def __init__(self, log_level='INFO'):
self.log_level = log_level
class ServiceManager:
def __init__(self, logger=None):
self.logger = logger or Logger()
def start_service(self):
if self.logger:
self.logger.log(f"Service started at {log_level}")
构造函数中的错误处理
class DatabaseConnection:
def __init__(self, connection_string):
try:
self.connection = self._establish_connection(connection_string)
except ConnectionError as e:
raise ValueError(f"Failed to connect: {e}")
def _establish_connection(self, connection_string):
## 连接逻辑
pass
最佳实践
- 保持构造函数简单且专注
- 使用类型提示以提高清晰度
- 验证输入参数
- 优先使用组合而非深度继承
在 LabEx,我们强调编写遵循坚实面向对象原则的简洁、可维护的构造函数代码。
性能优化
- 尽量减少繁重的初始化逻辑
- 延迟加载复杂资源
- 使用
__slots__
提高内存效率