Pergunta

Estou tentando criar um assistente de geração de personagens para um jogo.Em uma aula eu calculo os atributos do personagem.Em uma classe diferente, estou exibindo ao usuário quais especialidades estão disponíveis com base nos atributos do personagem.No entanto, não me lembro como passar variáveis ​​entre classes diferentes.

Aqui está um exemplo do que tenho:

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

O problema é que não consigo descobrir como usar a variável "inteligência" da classe BasicInfoPage para a classe MOS.Eu tentei várias coisas diferentes na Internet, mas nada parece funcionar.o que estou perdendo?

Editar Depois de postar isso, percebi que não expliquei muito bem.Estou tentando criar uma versão para computador do RPG Twilight 2000 da década de 1980.

Estou usando o wxPython para criar um assistente;a classe pai das minhas aulas é o Wizard do wxPython.Esse assistente orientará o usuário na criação de um personagem, portanto, a página Informações básicas (classe BasicInfoPage) permite que o usuário forneça o nome do personagem e "role" os atributos do personagem.É daí que vem a “autointeligência”.

Estou tentando utilizar os atributos criados nela para uma página mais adiante no assistente, onde o usuário seleciona a especialidade do personagem.As especialidades disponíveis dependem dos atributos que o personagem possui, por ex.se a inteligência for alta o suficiente, o personagem pode ser um Intel Anaylst.

Já se passaram vários anos desde que programei, especialmente com ideias de OOP.É por isso que estou confuso sobre como criar o que é essencialmente uma variável global com classes e métodos.

Foi útil?

Solução

Você pode ter confundido "Classe" e "Instância".Não está claro no seu exemplo, então presumo que você esteja usando muitas definições de classe e não tenha instâncias de objeto apropriadas dessas classes.

As classes realmente não possuem valores de atributos utilizáveis.Uma classe é apenas um conjunto comum de definições para uma coleção de objetos.Você deve pensar nas classes como definições, não como coisas reais.

Instâncias de classes, "objetos", são coisas reais que possuem valores de atributos reais e executam funções de método.

Você não passa variáveis ​​entre Aulas.Você passa variáveis ​​entre instâncias.Na prática, apenas as variáveis ​​de instância são importantes.[Sim, existem variáveis ​​de classe, mas são algo bastante especializado e muitas vezes confuso, é melhor evitá-las.]

Quando você cria um objeto (uma instância de uma classe)

b= BasicInfoPage(...)

Então b.intelligence é o valor da inteligência para o b instancia de BasicInfoPage.

Uma coisa muito comum é

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

Agora, dentro dos métodos MOS, você pode dizer self.basicInfo.intelligence porque o MOS tem um objeto que é BasicInfoPage disponível para ele.

Ao construir o MOS, você fornece a instância de BasicInfoPage que ele deve usar.

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

Agora, o objeto m pode examinar someBasicInfoPage.intelligence

Outras dicas

Cada página de um assistente - por si só - não deveria ser o contêiner para as informações que você está coletando.

Leia no Controle de visualização de modelo padrão de design.Suas páginas possuem as partes Visualização e Controle do design.Eles não são o modelo de dados, entretanto.

Você ficará mais feliz se tiver um objeto separado que seja “construído” pelas páginas.Cada página definirá alguns atributos desse objeto de modelo subjacente.Então, as páginas são independentes umas das outras, uma vez que todas as páginas obtêm e definem valores deste objeto de modelo subjacente.

Já que você está construindo um personagem, você teria uma aula como esta

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

Então, suas várias instâncias do Wizard só precisam receber o objeto Character subjacente como um local para colocar e obter valores.

Meu problema era de fato a confusão de classes vs.instâncias.Eu estava tentando fazer tudo por meio de aulas sem nunca criar uma instância real.Além disso, eu estava forçando a classe "BasicInfoPage" a trabalhar muito.

Por fim, criei uma nova classe (BaseAttribs) para armazenar todas as variáveis ​​que preciso.Em seguida, criei uma instância dessa classe ao executar o assistente e passei essa instância como argumento para as classes que precisam dela, conforme mostrado abaixo:

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

Em seguida, usei as informações fornecidas por S.Lott e criei instâncias individuais (se é assim que são chamadas) dentro de cada classe;cada classe está acessando as mesmas variáveis.

Tudo funciona, pelo que posso dizer.Obrigado.

Tudo que você precisa é de uma referência.Não é realmente um problema simples para o qual eu possa fornecer uma solução de uma linha (além de um simples global feio que provavelmente quebraria outra coisa), mas de estrutura de programa.Você não obtém acesso mágico a uma variável que foi criada em outra instância de outra classe.Você deve fornecer a referência de inteligência ao MOS ou retirá-la do BasicInfoPage, seja como for.Parece-me que as classes são projetadas de maneira um tanto estranha - uma página de informações, por um lado, não deveria gerar nada, e se gerar, deveria devolvê-lo a quem precisa saber - algum tipo de lugar central, que deveria ter sido quem o gerou em primeiro lugar.Normalmente, você definiria as variáveis ​​lá e as obteria a partir daí.Ou pelo menos eu faria.

Se você deseja a resposta básica de "como faço para passar variáveis ​​entre classes diferentes", então aqui está, mas duvido que seja exatamente o que você deseja, pois parece estar usando algum tipo de estrutura de controle:

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)

Se entendi corretamente, a resposta é:Você não pode.

intelligence deve ser um atributo de WizardPageSimple, se você quiser que ambas as classes o herdem.

Dependendo da sua situação, você pode tentar extrair inteligência e atributos relacionados em outra classe base.Então você poderia herdar de ambos:

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

Nesse caso você deve use o super cooperativo.Na verdade, você já deveria estar usando.Em vez de ligar

wiz.WizardPageSimple.__init__(self, parent)

chamar

super(MOS, self).__init__(self, parent)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top