سؤال

النظر في تعريفات الفئة التالية

class of2010(object):
    def __init__(self):
        self._a = 1
        self._b = 2
        self._c = 3

    def set_a(self,value):
        print('setting a...')
        self._a = value
    def set_b(self,value):
        print('setting b...')
        self._b = value
    def set_c(self,value):
        print('setting c...')
        self._c = value
    a = property(fset=self.set_a)
    b = property(fset=self.set_b)
    c = property(fset=self.set_c)

.لاحظ أن set_[a|b|c]() افعل نفس الشيء. هل هناك طريقة تحددها:

def set_magic(self,value):
    print('setting <???>...')
    self._??? = value

مرة واحدة واستخدامها لـ A ، B ، C على النحو التالي

a = property(fset=self.set_magic)
b = property(fset=self.set_magic)
c = property(fset=self.set_magic)
هل كانت مفيدة؟

المحلول

def attrsetter(attr):
  def set_any(self, value):
    setattr(self, attr, value)
  return set_any

a = property(fset=attrsetter('_a'))
b = property(fset=attrsetter('_b'))
c = property(fset=attrsetter('_c'))

نصائح أخرى

أرى أن المستقلين الخاص بك مجرد تسجيل رسالة ثم ببساطة تعيين القيمة - في الواقع ، إجابتك المقبولة مجرد يعين القيمة. هل تستخدم هذا النمط لأنه الممارسة المقبولة / الحكمة التقليدية في لغة أخرى ، ربما اسمه يبدأ اسم "J"؟ إذا كان الأمر كذلك ، فالرجاء تعلم أن النهج البيثوني لهذا التصميم نفسه هو أبسط بكثير:

class Of2010(object):
    def __init__(self):
        self.a = 1
        self.b = 2
        self.c = 3

لا يوجد مستقلين لا شيء ، لا توجد دالة وسيطة فقط لتعيين قيمة. "ما تقوله؟ "التعرض العام لمتغيرات الأعضاء؟ !!" نحن سوف، نعم فعلا.

انظر إلى هذه الفئات من وجهة نظر رمز العميل. لاستخدام فصولك ، يقوم العملاء بإنشاء كائن ، ثم تعيين خاصية "A"

obj = Of2010()
obj.a = 42

بشكل ملحوظ ، هذا هو نفس الرمز بالضبط لفئة 5-Liner التي نشرتها أعلاه.

لماذا تشجع اللغات J أسلوب الملكية الأكثر مطولاً؟ للحفاظ على واجهة الفصل في حالة التغيير في المستقبل في المتطلبات. إذا كان في مرحلة ما من الوقت ، يجب أن تتغير قيمة أخرى للكائن في حفل موسيقي مع أي تغييرات على A ، فيجب عليك تنفيذ آلية العقار. للأسف ، تكشف اللغة J عن طبيعة آلية الوصول إلى السمات إلى رمز العميل ، بحيث يتم تقديم خاصية في مرحلة ما في المستقبل مهمة إعادة تشكيل تدخلية تتطلب إعادة بناء جميع العملاء الذين يستفيدون من تلك الفئة و "A" السمة.

في بيثون ، ليس هذا هو الحال. يتم تحديد سمة "A" للكائن في وقت التشغيل في المتصل. نظرًا لأن الوصول المباشر والوصول إلى الممتلكات على حد سواء "انظر" على حد سواء ، فإن فئة Python الخاصة بك تحافظ على هذه الواجهة على الرغم من أن الآلية الفعلية مختلفة. ما يهم هو أنه متطابق فيما يتعلق برمز العميل.

لذلك في جافا ، يقدم المرء تعقيد الخصائص هذا مباشرة من بداية هذه الفئة (وفي الواقع ، من خلال الممارسة المقبولة ، من الكل الفصول الدراسية) ، على أنه قد يصبح ضروريًا يومًا ما في المستقبل. مع Python ، يمكن للمرء أن يبدأ بتنفيذ أبسط شيء يمكن أن ينجح ، أي الوصول المباشر إلى متغيرات الأعضاء البسيطة ، تاركًا النهج المعقد للوقت في المستقبل أن الأشياء الإضافية مطلوبة فعليًا وقيمة. نظرًا لأن ذلك اليوم قد لا يأتي أبدًا ، فهذه قفزة كبيرة إلى الأمام في الحصول على إصدار العمل الأول من الكود الخاص بك خارج الباب.

class...
 def __setattr__(self, name, value):
  print 'setting', name
  self.__dict__[name] = value

هذا هو.

قد تكون تبحث عنه__setattr__(self, name, value)

إلق نظرة هنا

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