Frage

Ich versuche, einen Zauberer der Charaktergeneration für ein Spiel zu erstellen. In einer Klasse I berechnen ich die Attribute des Charakters. In einer anderen Klasse zeige ich dem Benutzer, welche Spezialitäten basierend auf den Attributen des Charakters verfügbar sind. Ich kann mich jedoch nicht erinnern, wie man Variablen zwischen verschiedenen Klassen übergibt.

Hier ist ein Beispiel für das, was ich habe:

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")

Das Problem ist, dass ich nicht herausfinden kann, wie die Variable "Intelligenz" von der BasicinFopage -Klasse bis zur MOS -Klasse verwendet wird. Ich habe verschiedene Dinge aus dem Internet ausprobiert, aber nichts scheint zu funktionieren. Was vermisse ich?

Bearbeiten Nachdem ich das gepostet hatte, habe ich es nicht so gut erklärt. Ich versuche, eine Computerversion des Twilight 2000 RPG aus den 1980er Jahren zu erstellen.

Ich benutze WXPython, um einen Assistenten zu erstellen. Die übergeordnete Klasse meiner Klassen ist der Assistent von WXPython. Dieser Assistent führt einen Benutzer durch die Erstellung eines Charakters, sodass die grundlegende Informationsseite (Klasse Basicinfopage) dem Benutzer dem Namen des Charakters und "Rollen" für die Attribute des Charakters angeben kann. Dort kommt das "self.intelligence" her.

Ich versuche, die Attribute zu verwenden, die sie für eine Seite weiter im Assistenten erstellt haben, wo der Benutzer die Spezialität des Charakters auswählt. Die verfügbaren Spezialitäten hängen von den Attributen ab, die das Charakter hat, z. B. wenn die Intelligenz hoch genug ist, kann der Charakter ein Intel Anaylst sein.

Es ist einige Jahre her, seit ich programmiert habe, besonders mit OOP -Ideen. Deshalb bin ich verwirrt, wie ich eine globale Variable mit Klassen und Methoden erstellen kann.

War es hilfreich?

Lösung

Möglicherweise haben Sie "Klasse" und "Instanz" verwirrt. Aus Ihrem Beispiel geht nicht klar, also werde ich davon ausgehen, dass Sie viele Klassendefinitionen verwenden und keine geeigneten Objektinstanzen dieser Klassen haben.

Klassen haben keine nutzbaren Attributwerte. Eine Klasse ist nur eine gemeinsame Reihe von Definitionen für eine Sammlung von Objekten. Sie sollten sich von Klassen als Definitionen betrachten, nicht als tatsächliche Dinge.

Instanzen von Klassen, "Objekten", sind tatsächliche Dinge, die tatsächliche Attributwerte haben und Methodenfunktionen ausführen.

Sie bestehen keine Variablen unter Klassen. Sie passieren Variablen unter Instanzen. In praktischer Angelegenheit ist nur Instanzvariablen wichtig. [Ja, es gibt Klassenvariablen, aber sie sind eine ziemlich spezialisierte und oft verwirrende Sache, am besten vermieden.

Wenn Sie ein Objekt erstellen (eine Instanz einer Klasse)

b= BasicInfoPage(...)

Dann b.intelligence ist der Wert der Intelligenz für die b Beispiel von BasicInfoPage.

Eine wirklich verbreitete Sache ist

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

Jetzt können Sie innerhalb von MOS -Methoden sagen self.basicInfo.intelligence Weil MOS über ein Objekt verfügt, das ihm eine Basicinfopage darstellt.

Wenn Sie MOS bauen, stellen Sie es mit der Instanz von Basicinfopage zur Verfügung, die es verwenden soll.

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

Jetzt das Objekt m kann untersuchen someBasicInfoPage.intelligence

Andere Tipps

Jede Seite eines Assistenten - für sich selbst - sollte nicht der Container für die Informationen sein, die Sie sammeln.

Lesen Sie die Modell-View-Kontroll Designmuster. Ihre Seiten haben die Aussicht und Steuerungsteile des Designs. Sie sind jedoch nicht das Datenmodell.

Sie werden glücklicher sein, wenn Sie ein separates Objekt haben, das von den Seiten "erstellt" wird. Jede Seite setzt einige Attribute dieses zugrunde liegenden Modellobjekts. Anschließend sind die Seiten voneinander unabhängig, da die Seiten Werte dieses zugrunde liegenden Modellobjekts erhalten und festlegen.

Da Sie einen Charakter aufbauen, hätten Sie eine solche Klasse

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

Dann müssen Ihre verschiedenen Assistenteninstanzen nur das zugrunde liegende Zeichenobjekt als Ort zum Einlegen und Erhalten von Werten erhalten.

Mein Problem war in der Tat die Verwirrung von Klassen im Vergleich zu Instanzen. Ich habe versucht, alles über Klassen zu tun, ohne jemals eine tatsächliche Instanz zu erstellen. Außerdem habe ich die "Basicinfopage" -Klasse gezwungen, zu viel Arbeit zu leisten.

Letztendlich habe ich eine neue Klasse erstellt (Baseattribs) um alle Variablen zu halten, die ich brauche. Ich habe dann in der Instanz dieser Klasse erstellt, wenn ich den Assistenten ausführe und diese Instanz als Argument an die Klassen bestehe, die ihn brauchen, wie unten gezeigt:

#---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)

Ich habe dann die Informationen verwendet, die S.LtT bereitgestellt und einzelne Instanzen (falls dies genannt wird) in jeder Klasse erstellt und erstellt hat. Jede Klasse greift jedoch auf die gleichen Variablen zu.

Alles funktioniert, soweit ich das beurteilen kann. Vielen Dank.

Alles, was Sie brauchen, ist eine Referenz. Es ist nicht wirklich ein einfaches Problem, dem ich einer Line-Lösung geben kann (außer einer einfachen hässlichen Global, die wahrscheinlich etwas anderes brechen würde), sondern eine der Programmstruktur. Sie erhalten keinen magischen Zugriff auf eine Variable, die in einer anderen Instanz einer anderen Klasse erstellt wurde. Sie müssen entweder den Intelligenz Hinweis auf MOS geben oder sie von Basicinfopage nehmen, aber das kann passieren. Es scheint mir, dass die Klassen ziemlich seltsam gestaltet sind- eine Informationsseite zum einen sollte nichts erzeugen, und wenn dies der Fall ist, sollte sie sie wieder an alles geben, was wissen muss- eine Art zentraler Ort, welcher Sollte derjenige gewesen sein, der es überhaupt erzeugt. Normalerweise würden Sie die Variablen dort festlegen und sie von dort bekommen. Zumindest würde ich.

Wenn Sie die grundlegende Antwort von "Wie übertrage ich Variablen zwischen verschiedenen Klassen", dann gehen Sie hier, aber ich bezweifle, dass es genau das ist, was Sie wollen, da Sie einen kontrollierenden Framework verwenden möchten:

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)

Wenn ich Sie richtig verstanden habe, dann lautet die Antwort: Sie können nicht.

Intelligenz sollte ein Attribut von WizardPageSimple sein, wenn Sie möchten, dass beide Klassen es erben.

Abhängig von Ihrer Situation können Sie versuchen, Intelligenz und verwandte Attribute in eine andere Basisklasse zu extrahieren. Dann könnten Sie von beiden erben:

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

In diesem Fall Sie muss Verwenden Sie die Genossenschaft Super. Tatsächlich sollten Sie es bereits verwenden. Anstatt zu rufen

wiz.WizardPageSimple.__init__(self, parent)

Anruf

super(MOS, self).__init__(self, parent)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top