2010-09-09 6 views
0

Lorsque je travaille et met à jour une classe, je souhaite qu'une instance de classe déjà créée soit mise à jour. Comment vais-je faire cela?Instance de classe de mise à jour python pour refléter le changement dans une méthode de classe

class MyClass: 
""" """ 

def __init__(self): 

def myMethod(self, case): 
    print 'hello' 

classInstance = MyClass()

Je lance Python à l'intérieur de Maya et sur le logiciel démarrer l'instance est créée. Quand j'appelle classInstance.myMethod(), il affiche toujours 'bonjour' même si je change cela.

Merci,

/Christian

exemple plus complet:

class MayaCore: 
''' 
Super class and foundational Maya utility library 
''' 

def __init__(self): 
    """ MayaCore.__init__(): set initial parameters """ 

    #maya info 
    self.mayaVer = self.getMayaVersion() 


def convertToPyNode(self, node): 
    """  
    SYNOPSIS: checks and converts to PyNode 

    INPUTS: (string?/PyNode?) node: node name 

    RETURNS: (PyNode) node 
    """ 

    if not re.search('pymel', str(node.__class__)): 
     if not node.__class__ == str and re.search('Meta', str(node)): return node  # pass Meta objects too 
     return PyNode(node) 
    else: return node 

def verifyMeshSelection(self, all=0): 
    """ 
    SYNOPSIS: Verifies the selection to be mesh transform 
    INPUTS: all = 0 - acts only on the first selected item 
      all = 1 - acts on all selected items 
    RETURNS: 0 if not mesh transform or nothing is selected 
      1 if all/first selected is mesh transform 
    """ 
    self.all = all 
    allSelected = [] 
    error = 0 
    iSel = ls(sl=1) 
    if iSel != '': 
     if self.all: allSelected = ls(sl=1) 
     else: 
      allSelected.append(ls(sl=1)[0]) 

     if allSelected: 
      for each in allSelected: 
       if nodeType(each) == 'transform' and nodeType(each.getShape()) == 'mesh': 
        pass 
       else: error = 1 
     else: error = 1 
    else: error = 1 

    if error: return 0 
    else: return 1 

mCore = MayaCore()

La dernière ligne est à l'intérieur du fichier module (mCore = MayaCore ()). Il y a des tonnes de méthodes dans la classe donc je les ai enlevées pour raccourcir le défilement :-) Il y a aussi des instructions d'import au dessus de la classe mais elles bousillent la mise en forme pour une raison quelconque. Ici, ils sont:

from pymel.all import * 
import re 
from maya import OpenMaya as om 
from our_libs.configobj import ConfigObj 

if getMelGlobal('float', "mVersion") >= 2011: 
    from PyQt4 import QtGui, QtCore, uic 
    import sip 
    from maya import OpenMayaUI as omui 

intérieur Maya, nous importons cela et sous-classes de cette classe de début du programme:

from our_maya.mayaCore import * 

Dans d'autres outils que nous écrivons, nous appelons alors mCore.method() sur un besoin base. La mise en garde que je rencontre est que lorsque je vais modifier la méthode mCore et que l'appel d'instance est déjà en cours, je dois redémarrer Maya pour que toutes les instances soient mises à jour avec le changement de méthode (elles utiliseront toujours le méthode non modifiée).

+0

Y a-t-il une raison spécifique pour laquelle vous mettez 'myMethod' dans' __init__'? –

+0

Vous devez toujours placer quelque chose dans le bloc 'def __init __ (self)', sinon vous aurez des problèmes. – nmichaels

+0

Je ne veux pas que les méthodes s'exécutent quand j'exemple la classe.J'utilise la classe dans un package 3d et les méthodes de classe sont exécutées selon les besoins, mais j'instancie la classe lors de l'importation dans le package 3d. – Christian

Répondre

0

D'accord, d'essayer à nouveau, mais avec une nouvelle compréhension de la question:

class Foo(object): 
    def method(self): 
     print "Before" 

f = Foo() 
f.method() 
def new_method(self): 
    print "After" 

Foo.method = new_method 
f.method() 

imprimera

Before 
After 

Cela fonctionne avec des classes de style ancien aussi. La clé est en train de modifier la classe, sans outrepasser le nom de la classe.

+0

Désolé, j'ai mal formaté le message. J'utilise Python dans Maya et j'ai rencontré des problèmes pour mettre à jour de nouvelles classes de style. – Christian

+0

Je ne peux pas vraiment utiliser "instance.myMethod = lambda self: print" bye "" pour mettre à jour, car les appels d'instance font déjà partie d'autres outils dans le pipeline 3d. Je veux changer la méthode elle-même pour imprimer "bye", puis avoir le byte instance.myMethod(). Le problème que j'ai est seulement pendant une session de Maya. Si je redémarre le programme, toutes les instances sont mises à jour pour refléter les modifications que j'ai apportées à ma méthode. Peut-être que le problème est un problème Maya et pas un problème Python? – Christian

+0

Oh, donc vous voulez mettre à jour toutes les instances de la classe en même temps? – nmichaels

0

Vous devrez fournir plus de détails sur ce que vous faites, mais les instances Python ne stockent pas les méthodes, elles les obtiennent toujours de leur classe. Donc, si vous changez la méthode sur la classe, les instances existantes verront la nouvelle méthode.

+0

Je cours Python à l'intérieur de Maya. L'instance de classe est créée lorsque je démarre le logiciel et lorsque je mets à jour les méthodes dans la classe, l'appel classInstance.myMethod() n'exécute pas le code mis à jour, mais l'ancien code. – Christian

+0

Vous allez devoir nous montrer le vrai code. Comment créez-vous la classe en premier lieu, et comment modifiez-vous les méthodes? Les détails nous aideront vraiment à vous aider. –

+0

Edité le message principal avec plus de détails. – Christian

0

Mon autre réponse répond à votre question initiale, donc je la laisse là, mais je pense que ce que vous voulez vraiment, c'est la fonction reload.

import our_maya.mayaCore 
reload(our_maya.mayaCore) 
from our_maya.mayaCore import * 

Procédez ainsi après avoir modifié la définition de la classe. Votre nouvelle méthode doit apparaître et être utilisée par toutes les instances existantes de votre classe.

+0

J'ai essayé ça. Il n'actualise pas l'objet d'instance - il continuera à exécuter le code non modifié. – Christian

Questions connexes