Christian
Christian

Reputation: 11

python update class instance to reflect change in a class method

As I work and update a class, I want a class instance that is already created to be updated. How do I go about doing that?

class MyClass:
"""  """

def __init__(self):

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

classInstance = MyClass()

I run Python inside of Maya and on software start the instance is created. When I call classInstance.myMethod() it always prints 'hello' even if I change this.

Thank you,

/Christian

More complete example:

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

The last line is inside the module file (mCore = MayaCore()). There are tons of methods inside the class so I have removed them to shorten the scrolling :-) Also there are import statements above the class but they screw up the formatting for some reason. Here they are:

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

Inside Maya, we import this and subclasses of this class upon program start:

from our_maya.mayaCore import *

In other tools we write, we then call mCore.method() on a need basis. The caveat I am running into is that when I am going back to modify the mCore method and the instance call is already in play, I have to restart Maya for all the instances to get updated with the method change (they will still use the un-modified method).

Upvotes: 0

Views: 5092

Answers (3)

nmichaels
nmichaels

Reputation: 50991

My other answer answers your original question, so I'm leaving it there, but I think what you really want is the reload function.

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

Do that after you change the class definition. Your new method ought to show up and be used by all the existing instances of your class.

Upvotes: 0

nmichaels
nmichaels

Reputation: 50991

Alright, trying again, but with a new understanding of the 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()

will print

Before
After

This will work with old style classes too. The key is modifying the class, not overriding the class's name.

Upvotes: 1

Ned Batchelder
Ned Batchelder

Reputation: 375754

You'll have to provide more details about what you are doing, but Python instances don't store methods, they always get them from their class. So if you change the method on the class, existing instances will see the new method.

Upvotes: 0

Related Questions