3

ゲーム用のキャラクター生成ウィザードを作成しようとしています。あるクラスでは、キャラクターの属性を計算します。別のクラスでは、キャラクターの属性に基づいて利用できる専門分野をユーザーに表示しています。ただし、異なるクラス間で変数を渡す方法を思い出せません。

これが私が持っているものの例です:

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 クラスへの "intelligence" 変数の使用方法がわからないことです。私はインターネットの周りからいくつかの異なることを試しましたが、何もうまくいかないようです. 私は何が欠けていますか?

編集これを投稿した後、あまり説明していないことに気付きました。1980 年代の Twilight 2000 RPG のコンピューター バージョンを作成しようとしています。

wxPython を使用してウィザードを作成しています。私のクラスの親クラスは wxPython の Wizard です。このウィザードは、ユーザーにキャラクターの作成を案内するので、基本情報ページ (クラス BasicInfoPage) で、ユーザーはキャラクターの名前を指定し、キャラクターの属性を「ロール」することができます。それが「self.intelligence」の由来です。

ユーザーがキャラクターの専門分野を選択するウィザードのさらに先のページで、彼女が作成した属性を使用しようとしています。利用できる専門分野は、キャラクターが持つ属性によって異なります。たとえば、知性が十分に高い場合、キャラクターは Intel Analyst になることができます。

特に OOP のアイデアで、プログラミングを始めてから数年が経ちました。そのため、基本的にクラスとメソッドを使用してグローバル変数を作成する方法について混乱しています。

4

5 に答える 5

7

「クラス」と「インスタンス」が混同されている可能性があります。あなたの例からは明らかではないので、あなたは多くのクラス定義を使用していて、それらのクラスの適切なオブジェクトインスタンスを持っていないと思います。

クラスには、実際には使用可能な属性値がありません。クラスは、オブジェクトのコレクションの定義の一般的なセットです。クラスは、実際のものではなく、定義として考える必要があります。

クラスのインスタンスである「オブジェクト」は、実際の属性値を持ち、メソッド関数を実行する実際のものです。

クラス間で変数を渡さないでください。インスタンス間で変数を渡します。実際問題として、インスタンス変数のみが重要です。[はい、クラス変数はありますが、それらはかなり特殊で、しばしば混乱を招くものであり、避けるのが最善です。]

オブジェクト(クラスのインスタンス)を作成するとき

b= BasicInfoPage(...)

次に、のインスタンスのb.intelligenceインテリジェンスの値です。bBasicInfoPage

本当に一般的なことは

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

これで、MOSメソッド内で、self.basicInfo.intelligenceMOSにはBasicInfoPageを使用できるオブジェクトがあるためと言えます。

MOSをビルドするときは、使用することになっているBasicInfoPageのインスタンスをMOSに提供します。

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

これで、オブジェクトmは調べることができますsomeBasicInfoPage.intelligence

于 2008-09-22T10:12:50.783 に答える
4

ウィザードの各ページは、それ自体で、実際に収集する情報のコンテナであってはなりません。

Model-View-Controlデザインパターンを読んでください。ページには、デザインの表示部分と制御部分があります。ただし、これらはデータモデルではありません。

ページによって「構築」された別のオブジェクトがあると、より幸せになります。各ページは、その基礎となるモデルオブジェクトのいくつかの属性を設定します。次に、ページはすべてこの基になるモデルオブジェクトの値を取得および設定するため、ページは互いに独立しています。

キャラクターを作成しているので、このようなクラスがあります

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

次に、さまざまなWizardインスタンスに、値を配置および取得する場所として、基になるCharacterオブジェクトを指定する必要があります。

于 2008-09-22T10:18:04.687 に答える
2

私の問題は、クラスとインスタンスの混乱でした。実際のインスタンスを作成することなく、クラスを介してすべてを実行しようとしていました。さらに、「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 が提供した情報を使用して、各クラス内に個々のインスタンス (そう呼ばれている場合) を作成しました。ただし、各クラスは同じ変数にアクセスしています。

私が知る限り、すべてが機能します。ありがとう。

于 2008-09-23T09:48:59.430 に答える
1

必要なのはリファレンスだけです。(おそらく何か他のものを壊すであろう単純な醜いグローバルを除いて)私がいくつかの1行の解決策を与えることができるのは実際には単純な問題ではなく、プログラム構造の1つです。別のクラスの別のインスタンスで作成された変数に魔法のようにアクセスすることはありません。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)
于 2008-09-22T06:05:58.677 に答える
0

私があなたのことを正しく理解していれば、答えは次のとおりです。

両方のクラスにインテリジェンスを継承させたい場合は、インテリジェンスを WizardPageSimple の属性にする必要があります。

状況によっては、インテリジェンスと関連する属性を別のベースクラスに抽出しようとする場合があります。次に、両方から継承できます。

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

その場合は、協力スーパーを使用する必要があります。実際、あなたはすでにそれを使用しているはずです。呼び出す代わりに

wiz.WizardPageSimple.__init__(self, parent)

電話

super(MOS, self).__init__(self, parent)
于 2008-09-22T05:59:28.147 に答える