指示方法的decorator既是类又是实例方法
combomethod的Python项目详细描述
python有实例方法、类方法(@classmethod)和静态 方法(@staticmethod)。但是它没有一个清晰的方法来调用一个方法 在类或其实例上。有了combomethod,它就有了。
from combomethod import combomethod class A(object): @combomethod def either(receiver, x, y): return x + y a = A() assert a.either(1, 3) == 4 assert A.either(1, 3) == 4
喂!您的方法现在接受类或实例-以 一个你想叫它的人。
讨论
在某些情况下,可以用@classmethod来伪造@combomethod。在 例如,上面的代码没有对类的真正引用 或者实例,并且either可以被指定为@classmethod, 因为它们可以用类或实例调用。但是,有一个 问题:类方法总是将类传递给方法,即使它们是 用实例调用。使用这种方法,您永远无法访问 实例变量。哎哟!
或者,either可以被指定为@staticmethod, 已删除其receiver参数。但如果那样的话 可从实例或类调用,在任何情况下都不会传递 从中调用方法的对象。没有办法进入 类或实例变量。哎哟!
像@classmethod和@staticmethod一样有用,它们不处理 (有时很重要)你需要打电话给 类或实例和需要对执行 打电话来。下面是一个需要这样做的示例:
class Above(object): base = 10 def __init__(self, base=100): self.base = base @combomethod def above_base(receiver, x): return receiver.base + x a = Above() assert a.above_base(5) == 105 assert Above.above_base(5) == 15 aa = Above(12) assert aa.above_base(5) == 17 assert Above.above_base(5) == 15
当您需要调用实例或类时,您还需要 关于执行调用的对象,@combomethodrocks and rolls。
注释
- 这个模块主要是一个方便的包装,测试, Mike Axiak的洞察力和代码的文档化 Stack Overflow post。 谢谢你,迈克!
- 自动多版本测试管理 pytest, pytest-cov, coverage,和 tox。 持续集成测试 用Travis-CI。 用pyroma包装绒布。
- 成功地为所有最新型号的 python:2.6、2.7、3.3、3.4、3.5、3.6和3.7预发行版以及最新版本 pypy和pypy3构建。
- 有关完整的更改日志,请参见CHANGES.yml。
- 作者,Jonathan Eunice或 @jeunice on Twitter 欢迎您的意见和建议。
安装
要安装或升级到最新版本:
pip install -U combomethod
您可能需要在它们前面加上sudo来授权安装。在 在没有超级用户权限的环境中,您可能需要使用pip。 --user选项,仅为单个用户而不是整个系统安装。 您可能还需要python版本的单独pip2或pip3安装程序, 取决于您的系统配置。如果pip不是 为您需要的特定python实例进行了良好的配置,这是一个有用的回退:
python3.6 -m pip install -U combomethod