Pregunta

Estoy intentando crear un asistente de generación de personajes para un juego.En una clase calculo los atributos del personaje.En una clase diferente, le muestro al usuario qué especialidades están disponibles según los atributos del personaje.Sin embargo, no recuerdo cómo pasar variables entre diferentes clases.

Aquí hay un ejemplo de lo que tengo:

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

El problema es que no puedo entender cómo utilizar la variable "inteligencia" de la clase BasicInfoPage a la clase MOS.He probado varias cosas diferentes en Internet pero nada parece funcionar.¿Qué me estoy perdiendo?

Editar Después de publicar esto me di cuenta de que no lo había explicado muy bien.Estoy intentando crear una versión para computadora del juego de rol Twilight 2000 de los años 80.

Estoy usando wxPython para crear un asistente;La clase principal de mis clases es el Asistente de wxPython.Ese asistente guiará al usuario a través de la creación de un personaje, por lo que la página de Información básica (clase BasicInfoPage) le permite al usuario dar el nombre del personaje y "tirar" para obtener los atributos del personaje.De ahí viene la "autointeligencia".

Estoy intentando usar los atributos que ella creó para una página más adelante en el asistente, donde el usuario selecciona la especialidad del personaje.Las especialidades que están disponibles dependen de los atributos que tenga el personaje, p.Si la inteligencia es lo suficientemente alta, el personaje puede ser un analista de Intel.

Han pasado varios años desde que programé, especialmente con ideas de programación orientada a objetos.Es por eso que no sé cómo crear lo que es esencialmente una variable global con clases y métodos.

¿Fue útil?

Solución

Es posible que haya confundido "Clase" e "Instancia".No queda claro en su ejemplo, por lo que asumiré que está utilizando muchas definiciones de clases y no tiene instancias de objetos apropiadas para esas clases.

Las clases realmente no tienen valores de atributos utilizables.Una clase es simplemente un conjunto común de definiciones para una colección de objetos.Deberías pensar en las clases como definiciones, no como cosas reales.

Las instancias de clases, "objetos", son cosas reales que tienen valores de atributos reales y ejecutan funciones de métodos.

No pasas variables entre clases.Pasas variables entre instancias.Como cuestión práctica, sólo importan las variables de instancia.[Sí, hay variables de clase, pero son algo bastante especializado y a menudo confuso, es mejor evitarlo.]

Cuando creas un objeto (una instancia de una clase)

b= BasicInfoPage(...)

Entonces b.intelligence es el valor de la inteligencia para el b en vez de BasicInfoPage.

Algo muy común es

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

Ahora, dentro de los métodos MOS, puedes decir self.basicInfo.intelligence porque MOS tiene un objeto que es BasicInfoPage disponible.

Cuando construyes MOS, le proporcionas la instancia de BasicInfoPage que se supone que debe usar.

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

Ahora, el objeto m puede examinar someBasicInfoPage.intelligence

Otros consejos

Cada página de un asistente, por sí sola, no debería ser en realidad el contenedor de la información que estás recopilando.

Lea sobre el Modelo-Vista-Control patrón de diseño.Sus páginas tienen las partes Ver y Controlar del diseño.Sin embargo, no son el modelo de datos.

Estará más feliz si tiene un objeto separado "construido" por las páginas.Cada página establecerá algunos atributos de ese objeto del modelo subyacente.Entonces, las páginas son independientes entre sí, ya que todas las páginas obtienen y establecen valores de este objeto de modelo subyacente.

Ya que estás construyendo un personaje, tendrías una clase como esta.

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

Luego, a sus diversas instancias de Wizard solo se les debe dar el objeto Character subyacente como un lugar para colocar y obtener valores.

De hecho, mi problema fue la confusión de clases vs.instancias.Estaba intentando hacer todo a través de clases sin crear nunca una instancia real.Además, estaba obligando a la clase "BasicInfoPage" a trabajar demasiado.

Al final, creé una nueva clase (Atributos base) para contener todas las variables que necesito.Luego creé una instancia de esa clase cuando ejecuto el asistente y pasé esa instancia como argumento a las clases que la necesitan, como se muestra a continuación:

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

Luego utilicé la información que S.Lott proporcionó y creé instancias individuales (si así se llama) dentro de cada clase;Sin embargo, cada clase accede a las mismas variables.

Todo funciona, por lo que puedo decir.Gracias.

Todo lo que necesitas es una referencia.En realidad, no es un problema simple al que pueda darle una solución de una sola línea (aparte de un global feo y simple que probablemente rompería algo más), sino uno de estructura del programa.No obtienes acceso mágicamente a una variable que se creó en otra instancia de otra clase.Debe proporcionar la referencia de inteligencia a MOS o tomarla de BasicInfoPage, como sea que pueda suceder.Me parece que las clases están diseñadas de manera bastante extraña: una página de información, por un lado, no debería generar nada, y si lo hace, debería devolvérselo a quienes necesitan saber, una especie de lugar central, que debería haber sido quien lo generó en primer lugar.Normalmente, establecerías las variables allí y las obtendrías de allí.O al menos lo haría.

Si desea la respuesta básica de "¿cómo paso variables entre diferentes clases?", aquí la tiene, pero dudo que sea exactamente lo que desea, ya que parece estar utilizando algún tipo de marco de control:

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)

Si te entendí bien, entonces la respuesta es:No puedes.

La inteligencia debería ser un atributo de WizardPageSimple, si desea que ambas clases lo hereden.

Dependiendo de su situación, puede intentar extraer inteligencia y atributos relacionados en otra clase base.Entonces podrías heredar de ambos:

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

En ese caso tu debe Utilice el súper cooperativo.De hecho, ya deberías estar usándolo.en lugar de llamar

wiz.WizardPageSimple.__init__(self, parent)

llamar

super(MOS, self).__init__(self, parent)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top