我有一些代码,我在Python 2.4 ++开发和你打赌,我要的backport它到Python 2.1!

功能装饰是如此有吸引力,我在几个景点使用@classmethod,没有考虑的事实,这是唯一可用的起始2.4版本的通知。相同的功能是通过功能调节提供但这些出现在Python 2.2。 CFR: http://www.python.org/dev/peps/pep-0318 /

现在我们的一些客户似乎仍然依赖蟒2.1(ArcGIS 9.1中附带了它,使得它不能升级),其中甚至没有功能调节可...

我一直在寻找在Python 2.1的一些功能调节的定义,但我没有找到任何(我的意思是:工作)。任何人成功地解决了这个问题?

要更具体而言,我需要一种方法来在python 2.1运行此2.4代码:

Python 2.4.6 (#2, Mar 19 2009, 10:00:53) 
[GCC 4.3.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> class sic:
...   def f(cls):
...     print cls.__name__
...   f = classmethod(f)
... 
>>> sic().f()
sic
>>> sic.f()
sic
>>> 
有帮助吗?

解决方案

就像在我的旧配方为2.1静态方法:

class staticmethod:
    def __init__(self, thefunc): self.f = thefunc
    def __call__(self, *a, **k): return self.f(*a, **k)

您应该能够做一个2.1类方法如下:

class classmethod:
    def __init__(self, thefunc): self.f = thefunc
    def __call__(self, obj, *a, **k): return self.f(obj.__class__, *a, **k)

当然没有@语法,而是旧的方式(如在2.2):

class sic:
  def f(cls): ...
  f = classmethod(f)

如果这不起作用(对不起,已经很多年,因为我有一个Python 2.1左右进行测试),类将需要更明确地提供 - 因为你调用类方法的类对象之前就存在,它将需要通过名称 - 假定全局类,

class classmethod2:
    def __init__(self, thefunc, clsnam):
        self.f = thefunc
        self.clsnam = clsnam
    def __call__(self, *a, **k):
        klass = globals()[self.clsnam]
        return self.f(klass, *a, **k)

class sic2:
  def f(cls): ...
  f = classmethod2(f, 'sic2')

这真的很难找到优雅的方式来获取类对象(抑制自我的需求是比较容易的部分,什么足以为静态方法:你只需要包装的功能分为非函数调用的),因为2.1只有传统(老式类),无可用的元类,因此没有有sic2.f(真正的好办法)奇迹般地拿到CLS。

由于缺乏在2.1 @语法的必然要求的使用@classmethod代码编辑,一种替代方法是功能性(装饰一些方法是“类”的)移动到右侧的class语句的末尾(优点AFTER是类对象不当时存在)。

class classmethod3:
    def __init__(self, thefunc, klass):
        self.f = thefunc
        self.klass = klass
    def __call__(self, *a, **k):
        return self.f(self.klass, *a, **k)

def decorate(klass, klassmethodnames):
  for n in klassmethodnames:
    thefunc = klass.__dict__[n]
    setattr(klass, n, classmethod3(thefunc, klass))

class sic2:
  def f(cls): ...
  def g(self): ...
  def h(cls): ...
decorate(sic2, ['f', 'h'])

其他提示

如果只是@classmethod需要将回迁到Python 2.1。结果 有一个类方法仿真的python2.1 点击食谱 希望这有助于。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top