Skip to main content

Decorator indicating a method is both a class and an instance method

Project description

travisci PyPI Package latest release PyPI Package monthly downloads Supported versions Supported implementations Wheel packaging support Test line coverage Test branch coverage

Python has instance methods, class methods (@classmethod), and static methods (@staticmethod). But it doesn’t have a clear way to invoke a method on either a class or its instances. With combomethod, it does.

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

Voila! You method now takes either the class or the instance–whichever one you want to call it with.

Discussion

In some cases, you can fake @combomethod with @classmethod. In the code above, for example, there is no real reference to the class or instance, and either could have been designated a @classmethod, since they can be called with either classes or instances. But, there’s a problem: Class methods always pass the class to the method, even if they’re called with an instance. With this approach, you can never access the instance variables. Ouch!

Alternatively, either could have been designated a @staticmethod, had its receiver parameter been removed. But while it would then be callable from either an instance or a class, in neither case would it pass the object the method was called from. There’d never be a way to access either the class or instance variables. Ouch again!

As useful as @classmethod and @staticmethod are, they don’t handle the important case where you need to call with either the class or an instance and you need genuine access to the object doing the call. Here’s an example that needs this:

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

When you need to call with either an instance or a class, and you also care about the object doing the calling, @combomethod rocks and rolls.

Notes

  • This module is primarily a convenient packaging, testing, and documentation of insights and code from Mike Axiak’s Stack Overflow post. Thank you, Mike!

  • While the module is new to separate PyPI distribution, I’ve successfuly used it in production code for several years.

  • Automated multi-version testing managed with pytest, pytest-cov, coverage, and tox. Continuous integration testing with Travis-CI. Packaging linting with pyroma.

  • Successfully packaged for, and tested against, all late-model versions of Python: 2.6, 2.7, 3.2, 3.3, 3.4, and 3.5 as well as PyPy 2.6.1 (based on 2.7.10) and PyPy3 2.4.0 (based on 3.2.5).

  • The author, Jonathan Eunice or @jeunice on Twitter welcomes your comments and suggestions.

Installation

To install or upgrade to the latest version:

pip install -U combomethod

To easy_install under a specific Python version (3.3 in this example):

python3.3 -m easy_install --upgrade combomethod

(You may need to prefix these with sudo to authorize installation. In environments without super-user privileges, you may want to use pip’s --user option, to install only for a single user, rather than system-wide.)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

combomethod-1.0.5.zip (12.9 kB view details)

Uploaded Source

combomethod-1.0.5.tar.gz (5.9 kB view details)

Uploaded Source

Built Distribution

combomethod-1.0.5-py2.py3-none-any.whl (6.8 kB view details)

Uploaded Python 2Python 3

File details

Details for the file combomethod-1.0.5.zip.

File metadata

  • Download URL: combomethod-1.0.5.zip
  • Upload date:
  • Size: 12.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for combomethod-1.0.5.zip
Algorithm Hash digest
SHA256 e7eaf9857dd01ada984d9f5c572dc1a21b2d7e8f2a036deb9c192b51f9e612e8
MD5 c6fec3691c1bf47c64b3b6ce39dbbe44
BLAKE2b-256 f3009133d4fc1e6b23070cd6ebc2387145c8ec0bc4d103c273fd24b1cccd3089

See more details on using hashes here.

File details

Details for the file combomethod-1.0.5.tar.gz.

File metadata

  • Download URL: combomethod-1.0.5.tar.gz
  • Upload date:
  • Size: 5.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for combomethod-1.0.5.tar.gz
Algorithm Hash digest
SHA256 a87735204a7c87261fd22fe59f432a8a56a5c7bf2b8ff947c8f1159009b920b4
MD5 9f4882dfe40a7ca88c62f57f0b8c74e9
BLAKE2b-256 cba1ae07b19058581d2e7bf998feb374963ec37866345680707f9c4155e04a3b

See more details on using hashes here.

File details

Details for the file combomethod-1.0.5-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for combomethod-1.0.5-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 8d94611296cf806aed05d56b91dd18b5b31eba52dd49db1edab11fb41fc4abc5
MD5 84956f3f5492efc0c267ed14f038a0e4
BLAKE2b-256 38e9674e4061650f8f82549f101f43baba872a07ecf4fc069817b86727e14c42

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page