Python: خصائص متعددة ، Setter/getter واحدة
-
22-09-2019 - |
سؤال
النظر في تعريفات الفئة التالية
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)
إلق نظرة هنا