اعتراض التغيرات في الصفات في الطبقات في الطبقة - الثعبان

StackOverflow https://stackoverflow.com/questions/676826

سؤال

لقد تم العبث مع pygame و الثعبان و أريد أن تكون قادرة على استدعاء دالة عند سمة من صفي قد تغير.بلدي الحل الحالي في كونها:

class ExampleClass(parentClass):
   def __init__(self):
      self.rect = pygame.rect.Rect(0,0,100,100)
   def __setattr__(self, name, value):
      parentClass.__setattr__(self,name,value)
      dofancystuff()
Firstclass = ExampleClass()

هذا يعمل بشكل جيد و dofancystuff يسمى عند تغيير المستطيل قيمة مع Firsclass.rect = pygame.rect.Rect(0,0,100,100).ومع ذلك إذا قلت Firstclass.rect.bottom = 3. __setattr__ و هناك dofancystuff لا يسمى.

لذا سؤالي اعتقد هو كيف يمكنني اعتراض أي تغيير سمة من فئة فرعية?

تحرير:أيضا إذا أنا ذاهب عن هذا الطريق الخاطئ من فضلك قل لست حسن الاطلاع جدا عندما يتعلق الأمر بيثون.

هل كانت مفيدة؟

المحلول

حسنا، الجواب بسيط هو انك لا يمكن. في حالة Firstclass.rect = <...> يسمى __setattr__ الخاص بك. ولكن في حالة Firstclass.rect.bottom = 3 يتم استدعاء أسلوب __setattr__ مثيل مصحح. الحل الوحيد الذي أراه، هو خلق فئة مشتقة من pygame.rect.Rect حيث يمكنك الكتابة طريقة __setattr__. يمكنك أيضا قرد التصحيح الطبقة مصحح، ولكن هذا لا ينصح لأسباب وجيهة.

نصائح أخرى

هل يمكن أن تحاول __getattr__، والتي ينبغي أن يطلق على Firstclass.rect.

ولكن هل هذا بدلا من ذلك: إنشاء فئة منفصلة (فئة فرعية من pygame.rect؟) لExampleClass.rect. تنفيذ __setattr__ في تلك الفئة. الآن سوف يقال لك عن أي شيء يحصل في مجموعة عضوا rect عن ExampleClass. لا يزال بإمكانك تنفيذ __setattr__ في ExampleClass (و<م> يجب )، والآن فقط تأكد من مثيل نسخة من الطبقة rect الخاصة بك ...

وراجع للشغل: لا ندعو الأجسام Firstclass الخاص بك، كما ثم يبدو فئة بدلا من كائن ...

هذا لا يجيب على السؤال وإنما هو ذات الصلة:

self.__dict__[name] = value

هو على الأرجح أفضل من

parentClass.__setattr__(self, name, value)

هذا هو الموصى به من قبل الثعبان الوثائق (setattr">http://docs.python.org/2/reference/datamodel.html?highlight=setattr#object.setattr) و من المنطقي على أي حال في الحالة العامة حيث أنه لا يتحمل أي شيء عن سلوك parentClass setattr.

نعم المشورة غير المرغوب فيها أربع سنوات بعد فوات الأوان!

وأعتقد أن السبب لماذا لديك هذه الصعوبة يستحق مزيد من المعلومات قليلة من يتم توفيرها من قبل إجابات أخرى.

والمشكلة هي، عند القيام:

myObject.attribute.thing = value

وأنت لا تحديد قيمة السمة. رمز ما يعادل هذا:

anAttribute = myObject.attribute
anAttribute.thing = value

وكما هو يراه myObject، كل ما تفعلونه هو الحصول على السمة. كنت لا تعيين السمة.

وجعل فرعية من سمات الخاص بك الذي يمكنك التحكم، ويمكن أن تحدد __setattr__ لغير حل واحد.

وهناك حل بديل، قد يكون له معنى إذا كان لديك الكثير من الصفات على اختلاف أنواعها ولا تريد أن تجعل الكثير من الفئات الفرعية الفردية لجميع من لهم، لتجاوز __getattribute__ أو __getattr__ للعودة إلى الواجهة لالسمة التي ينفذ العمليات ذات الصلة في طريقة __setattr__ لها. أنا لم محاولة للقيام بذلك نفسي، ولكن أتصور أنه يجب أن تكون قادرة على تقديم فئة واجهة بسيطة من شأنها أن تكون بمثابة واجهة لأية وجوه.

وسوف تحتاج إلى أن تؤخذ في اختيار __getattribute__ العناية و __getattr__ . راجع وثائق مرتبطة في الجملة السابقة للحصول على معلومات، ولكن أساسا إذا تم استخدام __getattr__، سوف يكون أعلى أن تكون مغلفة / غموض بطريقة أو بأخرى حتى يعالج هذا __getattr__ طلبات فيهم صفات الفعلية، وإذا تم استخدام __getattribute__، فإنه سيكون لديك لاسترداد سمات عبر المكالمات إلى الفئة الأساسية.

وإذا كان كل ما نحاول القيام به هو تحديد ما إذا كان قد تم تحديث بعض rects، ثم وهذا هو مبالغة.

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