OOP Extensions是一组Python标准库中找不到的面向对象编程实用工具。
项目描述
什么是OOP扩展?
OOP扩展是一组用于面向对象编程的实用工具,这些工具在Python核心库中缺失。
用法
oop_ext提供了一组面向对象的实用工具,它支持接口、抽象/可重写方法等概念。oop_ext仔细检查实现是否具有与它实现的接口相同的函数签名,否则会引发异常。
以下是一个展示一些优秀功能的简单示例
from oop_ext.interface import Interface, ImplementsInterface
class IDisposable(Interface):
def dispose(self):
"""
Clears this object
"""
def is_disposed(self) -> bool:
"""
Returns True if the object has been cleared
"""
@ImplementsInterface(IDisposable)
class MyObject(Disposable):
def __init__(self):
super().__init__()
self._data = [0] * 100
self._is_disposed = False
def is_disposed(self) -> bool:
return self._is_disposed
def dispose(self):
self._is_disposed = True
self._data = []
如果MyObject中的任何两个方法未实现或与IDisposable中声明的签名不同,则ImplementsInterface装饰器在导入期间将引发错误。
可以使用IsImplementation验证任意对象是否实现特定接口
from oop_ext.interface import IsImplementation
my_object = MyObject()
if IsImplementation(my_object, IDisposable):
# my_object is guaranteed to implement IDisposable completely
my_object.dispose()
或者您可以使用AssertImplements断言对象实现了所需的接口
from oop_ext.interface import AssertImplements
my_object = MyObject()
AssertImplements(my_object, IDisposable)
my_object.dispose()
类型检查
从1.1.0版本开始,oop-ext包括内联类型注解,并将它们暴露给用户程序。
如果您在测试中运行类型检查器(如mypy),您可能会开始注意到指示不正确使用的类型错误。如果您遇到您认为是错误的错误,请在问题中告诉我们。
这些类型是在mypy版本0.800下开发的。
有关更多信息,请参阅文档。
贡献
有关设置开发环境和如何为oop_ext做出贡献的指导,请参阅贡献指南。
发布
关于如何进行新发布的维护者提醒。
请注意,VERSION应遵循语义版本控制,格式为X.Y.Z,例如:v1.0.5
从upstream/master创建一个release-VERSION分支。
更新CHANGELOG.rst。
推送带有更改的分支。
一旦所有构建都通过,请将VERSION标签推送到upstream。
合并PR。
2.1.0 (2021-03-19)
#48:添加了新的类型检查器友好的proxy = GetProxy(I, obj)函数,作为proxy = I(obj)的替代方案。后者通常不被类型检查器接受,因为接口是协议,不能被实例化。
还修复了AsssertImplements的类型检查错误
Only concrete class can be given where "Type[Interface]" is expected
这是由于python/mypy#5374。
2.0.0 (2021-03-10)
#47:接口不再检查类型注解。
最初支持此功能,但在实践中,此功能已显示出阻碍逐步采用类型注解的倾向,因为它会阻止添加类型注解来改进现有接口,或在不更新接口(以及所有其他实现)的情况下对现有实现进行注解。
因此,决定让静态类型检查器正确处理匹配的类型注解,因为它可以比oop-ext之前做得更准确。
1.2.0 (2021-03-09)
#43:修复了对类型注解的Attribute和ReadOnlyAttribute的支持
class IFoo(Interface): value: int = Attribute(int)
1.1.2 (2021-02-23)
问题#41:修复了在1.1.0版本中引入的回归,该回归导致使用callback.After或callback.Before安装回调会使方法不再符合其接口所需的签名。
1.1.1 (2021-02-23)
问题#38:重新引入extra_args参数到Callback._GetKey,以便子类可以利用它。
问题#36:修复了在1.1.0版本中引入的回归,该回归导致在接口实现中无法使用Abstract和Implements装饰器。
1.1.0 (2021-02-19)
问题#25:oop-ext现在包含内联类型注解,并将它们暴露给用户程序。
如果您在测试中运行类型检查器(如mypy),您可能会开始注意到指示不正确使用的类型错误。如果您遇到您认为是错误的错误,请在问题中告诉我们。
这些类型是在mypy版本0.800下开发的。
问题#26:引入了新的类型检查Callback变体,如Callback0、Callback1、Callback2等,在几乎零运行时成本的情况下提供对所有操作(调用、Register等)的类型检查。
示例
from oop_ext.foundation.callback import Callback2 def changed(x: int, v: float) -> None: ... on_changed = Callback2[int, float]() on_changed(10, 5.25)
修复了Callbacks.Before和Callbacks.After签名:之前它们的签名表明它们支持多个回调,但这是一种错误,因为它会破坏调用者,因为第2个参数之后的每个参数都会被认为是sender_as_parameter参数,该参数被转发到_shortcuts.py模块的After和Before函数。
1.0.0 (2020-10-01)
Callbacks可以用作上下文管理器,它提供了Register(callback, function),当上下文管理器结束时,它会自动注销所有函数。
Callback.Register(function)现在返回一个具有Unregister()方法的对象,可用于取消注册调用。
0.6.0 (2020-01-31)
将requires_declaration的默认值改回True,并修复了一个错误(#22),其中缓存没有正确清除。
0.5.1 (2019-12-20)
修复了一个问题(#20),其中模拟的classmethods在内部检查期间被认为不是有效的方法。
0.5.0 (2019-12-12)
添加可选参数requires_declaration,以便用户可以决定是否需要@ImplementsInterface声明。
0.4.0 (2019-12-03)
实现不再需要显式声明它们使用@ImplementsInterface声明接口:检查是由AssertImplements和等效函数隐式(并缓存)完成的。
0.3.2 (2019-08-22)
接口和实现方法不再可以包含可变默认值,因为这通常被认为是一种不良实践。
Null实例现在是可哈希的。
0.3.1 (2019-08-16)
修复了创建实例“接口存根”时的签名不匹配问题。
foo = IFoo(Foo())
0.3.0 (2019-08-08)
接口现在支持关键字参数。
0.2.4 (2019-03-22)
移除未使用的异常FunctionNotRegisteredError,该异常已停用多年。
0.2.3 (2019-03-22)
修复了嵌套回调中忽略异常的问题。
0.2.1 (2019-03-14)
修复问题并删除过时代码。
0.1.8 (2019-03-12)
PyPI上的首个版本。
项目详情
下载文件
下载适合您平台的文件。如果您不确定要选择哪个,请了解更多关于安装包的信息。
源分发
构建的发行版
oop-ext-2.1.0.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 9150af0aca05ed2feba15af78b84c46a3598d158ddc2a7ed3a89c1506ef34142 |
|
MD5 | 68589e13b2de9e16f5272514b6177ed5 |
|
BLAKE2b-256 | e90d440a16369b6afc16be5b65507ab1b9125cafb87923765d3c833577d9721a |
oop_ext-2.1.0-py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 7b79790cd2295764ad6139600f592bb188b18f36656186df222c73f4b0f6f4a8 |
|
MD5 | 20c6ddee9d9522f2e3e810d3a79e683c |
|
BLAKE2b-256 | 5ce29bac4411f41b40cf4d532506a4de887d6bfb55ce0d691eea3e6eaa1b5484 |