문제

나는 몇 가지 코드가 개발한에서는 python2.4++및 베팅,나는 백 포트는 그것을 python2.1!

기능 장식들 그렇게 매력적인는 사용@classmethod 에서 몇 가지 관광 명소,없이 통지를 복용한다는 사실만 사용할 수 있에서 시작 버전의 2.4.동일한 기능을 제공하여 기능을 수정하지만 이러한 등장에서는 파이썬 2.2.cfr: http://www.python.org/dev/peps/pep-0318/

이제 우리의 고객을 표시하는 수직에 의존하는 파이썬 2.1(ArcGIS9.1 선 그것으로 만든지 그 업그레이드 가능),심지어 기능 수정을 사용할 수 있습니다...

내가 찾고있는 몇 가지 기능 수정자의 정의에서는 파이썬 2.1 지만,나는 찾지 못했(뜻:일).사람이 성공적으로 이 문제를 해결?

더 구체적으로,필요로그램을 실행하는 방법을 이 2.4 코드에서는 파이썬 2.1:

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.1staticmethod:

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

당신을 할 수 있어야 한다 2.1classmethod 로:

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

No @-구문은 물론이지만,오히려 오래된 방법(처럼에서 2.2):

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

이것이 작동하지 않는 경우(안 많은 이후 몇 년 동안 나는 파이썬 2.1 주변을 테스트하는)클래스에서 제공해야 하는 더 명시적으로--및 이후 호출할 classmethod 클래스 전체가 존재하는 것이 필요하여 이름을 추측하는 글로벌 클래스

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')

그것은 정말 열심히 찾아를 얻을 수있는 방법 등체(을 억제하에 필요한 자기 쉬운 부분입니다,그리고 무엇이기에 충분한 staticmethod:당신을 감싸는 기능으로 비 함수 호출 가능)부터 2.1 만 기존(이전 스타일의 클래스),사용할 수 없는 메타클래스고,따라서 정말 좋은 방법이 있 sic2.f()마술을 얻는 cls.

의 부족 때문에@syntax2.1 필연적으로 편집을 사용하는 코드 @classmethod, 대안을 이동하는 기능(꾸미는 어떤 방법을"수업"사람)을 종료 후 class 문(장점은 클래스가 객체가 존재하에서 그 시간).

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 될 필요가 백포트 Python2.1.
조리법의 Classmethod 에뮬레이션에서 python2.1
희망이 도움이됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top