指示方法的decorator既是类又是实例方法

combomethod的Python项目详细描述


travisciPyPI Package latest releaseSupported versionsSupported implementationsWheel packaging supportTest line coverageTest branch coverage

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。 谢谢你,迈克!
  • 自动多版本测试管理 pytestpytest-covcoverage,和 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版本的单独pip2pip3安装程序, 取决于您的系统配置。如果pip不是 为您需要的特定python实例进行了良好的配置,这是一个有用的回退:

python3.6 -m pip install -U combomethod

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java OpenShift的齿轮特性   java如何在Liferay站点的每个页面上放置公司地址和电话?   java确定整数数组中是否存在一个子集,在两个条件下求和到给定的目标值   序列化为什么java中的serialVersionUID必须是静态的、最终的、长类型的?   java响应返回null   java注入接口实现Quarkus   java我不明白为什么第二次排序的运行时间比第一次慢?   (Java)显示图像的最佳方式?   java Android应用程序因添加布局而崩溃   java如何在运行时获取泛型变量的类   java Selenium web驱动程序:无效的选择器:*:WebKitFullScreenSentor   Spring中的java注入值始终为空   Eclipse中带有TestNG插件的@BeforeSuite和@AfterSuite的java问题   使用trycatch块、filewriter和printwriter在java中创建自定义类   如何在Java 安卓上绘制相交的两条线