سؤال

أرغب في إنشاء فصل فرعي يحتوي على طريقة للفئة الأصلية حيث تكون الطريقة عبارة عن "طريقة فئة" في الفصل الفرعي ولكن لا في الصف الوالدين.

في الأساس، أحاول تحقيق ما يلي:

class foo(Object):
    def meth1(self, val):
        self.value = val

class bar(foo):
    meth1 = classmethod(foo.meth1)
هل كانت مفيدة؟

المحلول

أنا أيضًا لست متأكدًا تمامًا من السلوك الذي تريده بالضبط، ولكن بافتراض أنك تريد أن يكون bar.meth1(42) مكافئًا لـ foo.meth1 كونه طريقة فئة لـ bar (مع كون "self" هي الفئة)، إذن يمكنك تحقيق ذلك مع:

def convert_to_classmethod(method):
    return classmethod(method.im_func)

class bar(foo):
    meth1 = convert_to_classmethod(foo.meth1)

المشكلة في classmethod(foo.meth1) هي أن foo.meth1 قد تم تحويله بالفعل إلى أسلوب، مع معنى خاص للمعلمة الأولى.تحتاج إلى التراجع عن هذا وإلقاء نظرة على كائن الوظيفة الأساسية، وإعادة تفسير ما تعنيه كلمة "الذات".

أود أيضًا أن أحذر من أن هذا أمر غريب جدًا، وبالتالي قد يسبب ارتباكًا لأي شخص يقرأ الكود الخاص بك.ربما يكون من الأفضل لك التفكير في حل مختلف لمشكلتك.

نصائح أخرى

ماذا تحاول تحقيقه؟إذا رأيت مثل هذا البناء في كود بايثون المباشر، فسأفكر في التغلب على المبرمج الأصلي.

السؤال كما هو مطروح يبدو غريبا جدا بالنسبة لي:لا أستطيع أن أرى لماذا يريد أي شخص أن يفعل ذلك.من المحتمل أنك تسيء فهم ماهية "طريقة الفصل" في Python (وهي مختلفة قليلاً عن الطريقة الثابتة في Java على سبيل المثال).

الطريقة العادية هي إلى حد ما مجرد دالة تأخذ كوسيطة أولى (تسمى عادةً "الذات")، ومثيل للفئة، والتي يتم استدعاؤها كـ ".".

إن ClassMethod هو مجرد وظيفة لا تقل سوى وسيطة لها الأولى (غالبًا ما تسمى "CLS") ، وهي فئة ، والتي يمكن استدعاءها ". أو كما ".".

مع أخذ ذلك في الاعتبار، والكود الموضح أعلاه، ماذا تتوقع أن يحدث إذا قام شخص ما بإنشاء مثيل لـ bar واستدعاء meth1 عليه؟

bar1 = bar()
bar1.meth1("xyz")

عندما يتم استدعاء كود meth1، يتم تمرير وسيطتين "self" و"val".أعتقد أنك تتوقع أن يتم تمرير "xyz" لـ "val"، ولكن ما الذي تعتقد أنه سيتم تمريره لـ "self"؟هل يجب أن يكون مثيل bar1 (في هذه الحالة، لم تكن هناك حاجة للتجاوز)؟أم ينبغي أن يكون شريط الفئة (ماذا سيفعل هذا الرمز إذن)؟

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