سؤال

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

وهنا مثال على ما لدي:

class BasicInfoPage(wx.wizard.WizardPageSimple):            
    def __init__(self, parent, title):
         wiz.WizardPageSimple.__init__(self, parent)
         self.next = self.prev = None
         self.sizer = makePageTitle(self, title)

                    <---snip--->

         self.intelligence = self.genAttribs()

class MOS(wx.wizard.WizardPageSimple):
     def __init__(self, parent, title):
         wiz.WizardPageSimple.__init__(self, parent)
         self.next = self.prev = None
         self.sizer = makePageTitle(self, title)
      def eligibleMOS(self, event):
          if self.intelligence >= 12: 
               self.MOS_list.append("Analyst")

المشكلة هي أنني لا أستطيع معرفة كيفية استخدام متغير "الذكاء" من فئة BasicInfoPage إلى فئة MOS.لقد قمت بتجربة العديد من الأشياء المختلفة عبر الإنترنت ولكن يبدو أن لا شيء يعمل.ماذا ينقصني؟

يحرر أدركت بعد أن نشرت هذا أنني لم أشرح ذلك جيدًا.أحاول إنشاء نسخة كمبيوتر من لعبة Twilight 2000 RPG من الثمانينات.

أنا أستخدم wxPython لإنشاء معالج؛الفئة الأصلية لفصولي هي المعالج من wxPython.سيرشد هذا المعالج المستخدم خلال عملية إنشاء شخصية، وبالتالي فإن صفحة المعلومات الأساسية (الفئة BasicInfoPage) تتيح للمستخدم إعطاء اسم الشخصية و"التدحرج" لسمات الشخصية.ومن هنا يأتي "الذكاء الذاتي".

أحاول استخدام السمات التي أنشأتها لصفحة أخرى في المعالج، حيث يحدد المستخدم تخصص الشخصية.تعتمد التخصصات المتوفرة على السمات التي تمتلكها الشخصية، على سبيل المثال.إذا كان الذكاء مرتفعًا بدرجة كافية، فيمكن أن تكون الشخصية محلل Intel.

لقد مرت عدة سنوات منذ أن قمت بالبرمجة، خاصة مع أفكار OOP.لهذا السبب أنا في حيرة من أمري بشأن كيفية إنشاء ما هو في الأساس متغير عالمي باستخدام الفئات والأساليب.

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

المحلول

قد يكون هناك خلط بين "الفئة" و"المثيل".ليس الأمر واضحًا من المثال الخاص بك، لذا سأفترض أنك تستخدم الكثير من تعريفات الفئات وليس لديك مثيلات كائنية مناسبة لتلك الفئات.

لا تحتوي الفئات حقًا على قيم سمات قابلة للاستخدام.الفصل هو مجرد مجموعة مشتركة من التعريفات لمجموعة من الكائنات.يجب أن تفكر في الفئات باعتبارها تعريفات، وليس أشياء فعلية.

مثيلات الفئات، "الكائنات"، هي أشياء فعلية لها قيم سمات فعلية وتقوم بتنفيذ وظائف الطريقة.

لا يمكنك تمرير المتغيرات بين الطبقات.يمكنك تمرير المتغيرات بين الحالات.من الناحية العملية، فإن متغيرات الحالة فقط هي التي تهم.[نعم، هناك متغيرات فئة، لكنها شيء متخصص إلى حد ما ومربك في كثير من الأحيان، ومن الأفضل تجنبه.]

عند إنشاء كائن (مثيل لفئة)

b= BasicInfoPage(...)

ثم b.intelligence هي قيمة الذكاء ل b حالة BasicInfoPage.

شيء شائع حقا هو

class MOS( wx.wizard.PageSimple ):
    def __init__( self, parent, title, basicInfoPage ):
        <snip>
        self.basicInfo= basicInfoPage

الآن، ضمن أساليب MOS، يمكنك القول self.basicInfo.intelligence لأن MOS يحتوي على كائن وهو BasicInfoPage متاح له.

عندما تقوم بإنشاء MOS، فإنك تزوده بمثيل BasicInfoPage الذي من المفترض أن يستخدمه.

someBasicInfoPage= BasicInfoPage( ... ) 
m= MOS( ..., someBasicInfoPage )

الآن، الكائن m يمكن فحص someBasicInfoPage.intelligence

نصائح أخرى

لا ينبغي أن تكون كل صفحة من صفحات المعالج - في حد ذاتها - حاوية للمعلومات التي تجمعها.

إقرأ على التحكم في عرض النموذج نمط التصميم.تحتوي صفحاتك على أجزاء العرض والتحكم في التصميم.ومع ذلك، فهي ليست نموذج البيانات.

ستكون أكثر سعادة إذا كان لديك كائن منفصل "تم إنشاؤه" بواسطة الصفحات.ستقوم كل صفحة بتعيين بعض سمات كائن النموذج الأساسي هذا.بعد ذلك، تكون الصفحات مستقلة عن بعضها البعض، نظرًا لأن جميع الصفحات تحصل على قيم كائن النموذج الأساسي وتعيينها.

نظرًا لأنك تقوم ببناء شخصية، فسيكون لديك فئة مثل هذه

class Character( object ):
    def __init__( self ):
        self.intelligence= 10
        <default values for all attributes.>

ثم تحتاج مثيلات المعالج المختلفة الخاصة بك فقط إلى إعطاء كائن الحرف الأساسي كمكان لوضع القيم والحصول عليها.

كانت مشكلتي بالفعل هي الخلط بين الفصول الدراسية مقابل الفصول الدراسية.الحالات.كنت أحاول القيام بكل شيء عبر الفصول الدراسية دون إنشاء مثيل فعلي على الإطلاق.بالإضافة إلى ذلك، كنت أجبر فئة "BasicInfoPage" على القيام بالكثير من العمل.

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

#---Run the wizard
if __name__ == "__main__":
    app = wx.PySimpleApp()
    wizard = wiz.Wizard(None, -1, "TW2K Character Creation")
    attribs = BaseAttribs

#---Create each page
    page1 = IntroPage(wizard, "Introduction")
    page2 = BasicInfoPage(wizard, "Basic Info", attribs)
    page3 = Ethnicity(wizard, "Ethnicity")
    page4 = MOS(wizard, "Military Occupational Specialty", attribs)

ثم استخدمت المعلومات التي قدمها S.Lott وأنشأت مثيلات فردية (إذا كان هذا هو ما يطلق عليه) داخل كل فئة؛كل فئة تصل إلى نفس المتغيرات بالرغم من ذلك.

كل شيء يعمل، بقدر ما أستطيع أن أقول.شكرًا.

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

إذا كنت تريد الإجابة الأساسية عن "كيف يمكنني تمرير المتغيرات بين الفئات المختلفة"، فها أنت ذا، لكنني أشك في أن هذا هو بالضبط ما تريده، حيث أنك تتطلع إلى استخدام نوع من إطار التحكم:

class Foo(object):
    def __init__(self, var):
        self.var = var

class Bar(object):
    def do_something(self, var):
        print var*3

if __name__ == '__main__':
    f = Foo(3)
    b = Bar()
    # look, I'm using the variable from one instance in another!
    b.do_something(f.var)

إذا فهمتك بشكل صحيح فالجواب هو:لا يمكنك.

يجب أن يكون الذكاء إحدى سمات WizardPageSimple، إذا كنت تريد أن يرثها كلا الفئتين.

اعتمادًا على موقفك، قد تحاول استخراج الذكاء والسمات ذات الصلة إلى فئة أساسية أخرى.ثم يمكنك أن ترث من كليهما:

class MOS(wiz.WizardPageSimple, wiz.IntelligenceAttributes): # Or something like that.

في هذه الحالة أنت يجب استخدام السوبر التعاونية.في الواقع، يجب أن تستخدمه بالفعل.بدلا من الدعوة

wiz.WizardPageSimple.__init__(self, parent)

يتصل

super(MOS, self).__init__(self, parent)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top