سؤال

لدي بعض التعليمات البرمجية التي قمت بتطويرها في Python 2.4 ++ وأنت تراهن، يجب أن أتركها إلى Python 2.1!

كانت ديكورات الوظائف جذابة للغاية لأنني استخدمت classmehethod في بعض المواقع، دون الإشارة إلى حقيقة أنها متاحة فقط بدءا من الإصدار 2.4. يتم تقديم نفس الوظيفة بواسطة معدلات الوظائف ولكن ظهرت هذه في بيثون 2.2. CFR: http://www.python.org/dev/peps/peps/pep-0318/

الآن يبدو أن بعض عملائنا لا يزال يعتمدون على Python 2.1 (ArcGIS 9.1 السفن معها ويجعل عدم الترقية)، حيث لا تتوفر معدلات الوظائف حتى ...

لقد كنت أبحث عن تعريفات تعديل وظيفة في Python 2.1، لكنني لم أجد أي (أعني: العمل). أي شخص حل بنجاح هذه المشكلة؟

أن تكون أكثر ملموسة، أحتاج إلى طريقة لتشغيل هذا الرمز 2.4 في Python 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.1 staticmethod:

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

يجب أن تكون قادرا على القيام بدقة 2.1 Classmethod على النحو التالي:

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

رقم @-Syntax بالطبع، ولكن الطريقة القديمة (مثل في 2.2):

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

إذا كان هذا لا يعمل (آسف، كان عدة سنوات عديدة منذ أن كان لدي ثعبان 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')

من الصعب حقا العثور على طرق أنيقة للحصول على كائن الفصل (قمع الحاجة إلى الذات هو الجزء السهل، وما يكفي من أجل staticmethod: تحتاج فقط إلى التفاف الوظيفة إلى غير قادر على الاستخدام) منذ 2.1 كان له إرث فقط (قديم الطبقات -Style)، لا توجد مشطيات قابلة للاستخدام، وبالتالي لا توجد طريقة جيدة حقا للحصول على SIC2.F () سحرية

نظرا لأن عدم وجود بناء الجملة في 2.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 إلى أن يتم الرجوع إليها إلى Python 2.1.
هناك وصفة مضاهاة ClassMethod في Python2.1
نأمل أن تكون هذه المساعدة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top