python:常规方法和类方法之间的混合

标签 python methods decorator python-decorators class-method

有时我需要用静态方法编写类, 但是有可能初始化它并保持状态(对象)

比如:

class A:
  @classmethod
  def method(cls_or_self):
    # get reference to object when A().method() or to class when A.method()
    code

我现在拥有的是:

class A:
   def method(self = None, *params): code
   # or
   def method2(self = None, **params): code
   # but what I need is rather normal parameters, not optional and named args:
   def method3(self_or_cls, a, b=1, c=2, *p, **kw): code

请不要写静态方法和类方法之间的区别。我对这种装饰器是否存在(在或多或少的标准库中)以及以上是否适用于 PEP 感兴趣。

最佳答案

函数和 classmethod 对象充当 descriptors ;两者都返回一个包装器,该包装器在被调用时将依次调用带有额外参数的底层函数。函数和 classmethod 对象的行为方式之间的唯一区别在于额外参数 是什么

要创建这两种方法的混合体,请构建您自己的描述符装饰器:

from functools import wraps

class hybridmethod(object):
    def __init__(self, func):
        self.func = func

    def __get__(self, obj, cls):
        context = obj if obj is not None else cls

        @wraps(self.func)
        def hybrid(*args, **kw):
            return self.func(context, *args, **kw)

        # optional, mimic methods some more
        hybrid.__func__ = hybrid.im_func = self.func
        hybrid.__self__ = hybrid.im_self = context

        return hybrid

在这里,我们返回一个包装器,它将使用类或实例作为第一个参数,具体取决于调用描述符 __get__ 方法时可用的参数。

演示:

>>> class Foo(object):
...     @hybridmethod
...     def bar(cls_or_self):
...         print 'Called with cls_or_self={!r}'.format(cls_or_self)
... 
>>> Foo.bar()
Called with cls_or_self=<class '__main__.Foo'>
>>> Foo().bar()
Called with cls_or_self=<__main__.Foo object at 0x1043a4390>

关于python:常规方法和类方法之间的混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18078744/

相关文章:

python - 如何以编程方式对 Django 中的用户进行身份验证?

python - Django 说 "didn' t 返回一个 HttpResponse 对象。相反,它返回 None 。”

python - Azure 数据湖的 Pyarrow 切片下推

python - 当我不想复制父类中的每个方法时,如何为 Python 子类中的每个方法添加延迟

Javascript 平滑方法链接

python - 在将函数附加为对象属性的装饰器中使用 functools.partial

python - 同一图中的正常和 cartopy 子图的组合

javascript - Uncaught ReferenceError : makeDrink is not defined

python - 在 Python 中从子类访问父类中的装饰器

python - Nose 测试用例上的装饰器产生