Python空对象模式
2026/6/11 15:57:48 网站建设 项目流程

# Python 空对象模式 (Null Object)
# NullObject 取代 None,消除大量 if x is not None 判空检查,
# 使代码更简洁安全。示例:NullLogger, NullDatabase, NullFileHandler。

from abc import ABC, abstractmethod
from typing import Optional

# 抽象接口
class Logger(ABC):
@abstractmethod
def info(self, msg: str) -> None: ...
@abstractmethod
def error(self, msg: str) -> None: ...

class Database(ABC):
@abstractmethod
def connect(self) -> None: ...
@abstractmethod
def query(self, sql: str) -> list[dict]: ...
@abstractmethod
def close(self) -> None: ...

class FileHandler(ABC):
@abstractmethod
def read(self) -> str: ...
@abstractmethod
def write(self, content: str) -> None: ...

# 真实实现
class ConsoleLogger(Logger):
def info(self, msg: str) -> None:
print(f"[INFO] {msg}")
def error(self, msg: str) -> None:
print(f"[ERROR] {msg}")

class SQLiteDatabase(Database):
def connect(self) -> None:
print("[DB] 连接数据库")
def query(self, sql: str) -> list[dict]:
print(f"[DB] 查询: {sql}"); return []
def close(self) -> None:
print("[DB] 关闭连接")

class RealFileHandler(FileHandler):
def __init__(self, path: str):
self._path = path
def read(self) -> str:
try:
with open(self._path) as f:
return f.read()
except FileNotFoundError:
return ""
def write(self, content: str) -> None:
with open(self._path, "w") as f:
f.write(content)

# 空对象实现
class NullLogger(Logger):
def info(self, msg: str) -> None: pass
def error(self, msg: str) -> None: pass

class NullDatabase(Database):
def connect(self) -> None: pass
def query(self, sql: str) -> list[dict]: return []
def close(self) -> None: pass

class NullFileHandler(FileHandler):
def read(self) -> str: return ""
def write(self, content: str) -> None: pass

# 应用层:空对象替代 None 默认值
class Application:
def __init__(self, logger: Optional[Logger] = None,
db: Optional[Database] = None,
fh: Optional[FileHandler] = None):
self._log = logger if logger else NullLogger()
self._db = db if db else NullDatabase()
self._file = fh if fh else NullFileHandler()

def run(self) -> None:
self._log.info("启动应用"); self._db.connect()
results = self._db.query("SELECT 1")
data = self._file.read()
self._log.info(f"结果: {len(results)} 条, 文件: {len(data)} 字符")
self._db.close(); self._log.info("应用结束")

if __name__ == "__main__":
Application(logger=ConsoleLogger()).run()
Application().run() # 全空对象运行

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询