当前位置: 首页 > news >正文

手机网站 等比缩放html网站开发视频

手机网站 等比缩放,html网站开发视频,医院网站开发方案,网站的大图标怎么做今天我们来聊聊 Python 中的抽象基类#xff08;Abstract Base Class#xff0c;简称 ABC#xff09;。虽然这个概念在 Python 中已经存在很久了#xff0c;但在日常开发中#xff0c;很多人可能用得并不多#xff0c;或者用得不够优雅。 让我们从一个实际场景开始…今天我们来聊聊 Python 中的抽象基类Abstract Base Class简称 ABC。虽然这个概念在 Python 中已经存在很久了但在日常开发中很多人可能用得并不多或者用得不够优雅。 让我们从一个实际场景开始假设你正在开发一个文件处理系统需要支持不同格式的文件读写比如 JSON、CSV、XML 等。 初始版本简单但不够严谨 我们先来看看最简单的实现方式 class FileHandler:def read(self, filename):passdef write(self, filename, data):passclass JsonHandler(FileHandler):def read(self, filename):import jsonwith open(filename, r) as f:return json.load(f)def write(self, filename, data):import jsonwith open(filename, w) as f:json.dump(data, f)class CsvHandler(FileHandler):def read(self, filename):import csvwith open(filename, r) as f:return list(csv.reader(f))这个实现看起来没什么问题但实际上存在几个隐患 无法强制子类实现所有必要的方法基类方法的签名参数列表可能与子类不一致没有明确的接口契约 改进版本使用抽象基类 让我们引入 abc.ABC 来改进这个设计 from abc import ABC, abstractmethodclass FileHandler(ABC):abstractmethoddef read(self, filename: str):读取文件内容passabstractmethoddef write(self, filename: str, data: any):写入文件内容passclass JsonHandler(FileHandler):def read(self, filename: str):import jsonwith open(filename, r) as f:return json.load(f)def write(self, filename: str, data: any):import jsonwith open(filename, w) as f:json.dump(data, f)这个版本引入了两个重要的改进 使用 ABC 将 FileHandler 声明为抽象基类使用 abstractmethod 装饰器标记抽象方法 现在如果我们尝试实例化一个没有实现所有抽象方法的子类Python 会抛出异常 # 这个类缺少 write 方法的实现 class BrokenHandler(FileHandler):def read(self, filename: str):return some data# 这行代码会抛出 TypeError handler BrokenHandler() # TypeError: Cant instantiate abstract class BrokenHandler with abstract method write进一步优化添加类型提示和接口约束 让我们再进一步添加类型提示和更严格的接口约束 from abc import ABC, abstractmethod from typing import Any, List, Dict, Unionclass FileHandler(ABC):abstractmethoddef read(self, filename: str) - Union[Dict, List]:读取文件内容并返回解析后的数据结构passabstractmethoddef write(self, filename: str, data: Union[Dict, List]) - None:将数据结构写入文件passpropertyabstractmethoddef supported_extensions(self) - List[str]:返回支持的文件扩展名列表passclass JsonHandler(FileHandler):def read(self, filename: str) - Dict:import jsonwith open(filename, r) as f:return json.load(f)def write(self, filename: str, data: Dict) - None:import jsonwith open(filename, w) as f:json.dump(data, f)propertydef supported_extensions(self) - List[str]:return [.json]# 使用示例 def process_file(handler: FileHandler, filename: str) - None:if any(filename.endswith(ext) for ext in handler.supported_extensions):data handler.read(filename)# 处理数据...handler.write(fprocessed_{filename}, data)else:raise ValueError(fUnsupported file extension for {filename})这个最终版本的改进包括 添加了类型提示提高代码的可读性和可维护性引入了抽象属性supported_extensions使接口更完整通过 Union 类型提供了更灵活的数据类型支持提供了清晰的文档字符串 使用抽象基类的好处 接口契约抽象基类提供了明确的接口定义任何违反契约的实现都会在运行前被发现。 代码可读性通过抽象方法清晰地表明了子类需要实现的功能。 类型安全结合类型提示我们可以在开发时就发现潜在的类型错误。 设计模式支持抽象基类非常适合实现诸如工厂模式、策略模式等设计模式。 NotImplementedError 还是 ABC 很多 Python 开发者会使用 NotImplementedError 来标记需要子类实现的方法 class FileHandler:def read(self, filename: str) - Dict:raise NotImplementedError(Subclass must implement read method)def write(self, filename: str, data: Dict) - None:raise NotImplementedError(Subclass must implement write method)这种方式看起来也能达到目的但与 ABC 相比有几个明显的劣势 延迟检查使用 NotImplementedError 只能在运行时发现问题而 ABC 在实例化时就会检查。 # 使用 NotImplementedError 的情况 class BadHandler(FileHandler):passhandler BadHandler() # 这行代码可以执行 handler.read(test.txt) # 直到这里才会报错# 使用 ABC 的情况 class BadHandler(FileHandler): # FileHandler 是 ABCpasshandler BadHandler() # 直接在这里就会报错缺乏语义NotImplementedError 本质上是一个异常而不是一个接口契约。 IDE 支持现代 IDE 对 ABC 的支持更好能提供更准确的代码提示和检查。 不过NotImplementedError 在某些场景下仍然有其价值 当你想在基类中提供部分实现但某些方法必须由子类覆盖时 from abc import ABC, abstractmethodclass FileHandler(ABC):abstractmethoddef read(self, filename: str) - Dict:passdef process(self, filename: str) - Dict:data self.read(filename)if not self._validate(data):raise ValueError(Invalid data format)return self._transform(data)def _validate(self, data: Dict) - bool:raise NotImplementedError(Subclass should implement validation)def _transform(self, data: Dict) - Dict:# 默认实现return data这里_validate 使用 NotImplementedError 而不是 abstractmethod表明它是一个可选的扩展点而不是必须实现的接口。 代码检查工具的配合 主流的 Python 代码检查工具pylint、flake8都对抽象基类提供了良好的支持。 Pylint Pylint 可以检测到未实现的抽象方法 # pylint: disablemissing-module-docstring from abc import ABC, abstractmethodclass Base(ABC):abstractmethoddef foo(self):passclass Derived(Base): # pylint: error: Abstract method foo not implementedpass你可以在 .pylintrc 中配置相关规则 [MESSAGES CONTROL] # 启用抽象类检查 enableabstract-methodFlake8 Flake8 本身不直接检查抽象方法实现但可以通过插件增强这个能力 pip install flake8-abstract-base-class配置 .flake8 [flake8] max-complexity 10 extend-ignore ABC001metaclassABCMeta vs ABC 在 Python 中有两种方式定义抽象基类 # 方式 1直接继承 ABC from abc import ABC, abstractmethodclass FileHandler(ABC):abstractmethoddef read(self):pass# 方式 2使用 metaclass from abc import ABCMeta, abstractmethodclass FileHandler(metaclassABCMeta):abstractmethoddef read(self):pass这两种方式在功能上是等价的因为 ABC 类本身就是用 ABCMeta 作为元类定义的 class ABC(metaclassABCMeta):Helper class that provides a standard way to create an ABC usinginheritance.pass选择建议 推荐使用 ABC 代码更简洁更符合 Python 的简单直观原则是 Python 3.4 后推荐的方式 使用 metaclassABCMeta 的场景 当你的类已经有其他元类时需要自定义元类行为时 例如当你需要组合多个元类的功能时 class MyMeta(type):def __new__(cls, name, bases, namespace):# 自定义的元类行为return super().__new__(cls, name, bases, namespace)class CombinedMeta(ABCMeta, MyMeta):passclass MyHandler(metaclassCombinedMeta):abstractmethoddef handle(self):pass实践建议 当你需要确保一组类遵循相同的接口时使用抽象基类。 优先使用类型提示它们能帮助开发者更好地理解代码。 适当使用抽象属性property abstractmethod它们也是接口的重要组成部分。 在文档字符串中清晰地说明方法的预期行为和返回值。 通过这个实例我们可以看到抽象基类如何帮助我们写出更加健壮和优雅的 Python 代码。它不仅能够捕获接口违规还能提供更好的代码提示和文档支持。在下一个项目中不妨试试用抽象基类来设计你的接口
http://www.hkea.cn/news/14275455/

相关文章:

  • 网站建设及托管合同代码网站模板
  • 塘厦镇网站仿做大型淘宝客返利网站建设
  • 整套网站模板下载兰州 网站建设
  • 湛江市住房和城乡建设局网站网站访问大小 计算流量
  • 小企业网站制作东莞有什么比较好的网站公司
  • P2P网站怎么建设wordpress 标签 图片
  • 个人备案 可以做企业网站吗自己怎么创建免费网站
  • 廊坊论坛网站建设网络营销与直播电商是干什么的
  • 上传网站空间国家备案查询网
  • 网站需求报告怎么写网站建设 网络推广 网站优化
  • 人才网站建设的目标天津企业网站制作
  • 广州网站建设性价比云南楚雄地图
  • 淘宝上做进出口网站有哪些国外流行的内容网站
  • 网站运营需要服务器吗全国最缺工100个职业排行出炉
  • 六安开发区网站网页制作基础教程第二章
  • 微信网站设计价格播州区建设局网站
  • 佛山做网站多少钱金蝶软件免费版下载
  • 摄影网站排行榜前十名二维码在线生成
  • 怎么样自己做一个网站做餐饮网站价格
  • 视频转动图在线制作网站中国十大咨询公司
  • dw中网站统计总访问量怎么做在线网页游戏传奇
  • 深圳服务好的网站建设北京百度seo排名
  • vs2012 网站开发来宾网站建设公司
  • 建站平台软件已注册的网站如何注销
  • 网站策划书优势怎么分析国外建站用什么最多
  • 网站建设插件代码大全如何制作自己个人小程序
  • 怎么做电影网站东莞市建设局网app
  • 做网站一定要有营业执照吗政务网站建设 发言
  • 怎样建设一个英语网站莆田建设网站
  • 上海知名的网站建设WordPress 蜘蛛池