экземпляр класса Python для отражения изменений в методе класса - PullRequest
0 голосов
/ 09 сентября 2010

Поскольку я работаю и обновляю класс, я хочу, чтобы экземпляр класса, который уже создан, был обновлен.Как мне это сделать?

class MyClass:
"""  """

def __init__(self):

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

classInstance = MyClass ()

Я запускаю Python внутри Maya и при запуске программного обеспечения создается экземпляр.Когда я вызываю classInstance.myMethod (), он всегда печатает «привет», даже если я изменяю это.

Спасибо,

/ Christian

Более полный пример:

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

Последняя строка находится внутри файла модуля (mCore = MayaCore ()).Внутри класса есть тонны методов, поэтому я удалил их, чтобы сократить прокрутку :-) Также есть операторы импорта над классом, но они по какой-то причине испортили форматирование.Вот они:

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

Внутри Maya мы импортируем этот и подклассы этого класса при запуске программы:

from our_maya.mayaCore import *

В других инструментах, которые мы пишем, мы затем вызываем mCore.method () по необходимости.Предостережение, с которым я сталкиваюсь, заключается в том, что когда я возвращаюсь к изменению метода mCore и вызов экземпляра уже запущен, мне нужно перезапустить Maya, чтобы все экземпляры обновились с изменением метода (они по-прежнему будут использоватьмодифицированный метод).

Ответы [ 3 ]

0 голосов
/ 09 сентября 2010

Вам нужно будет предоставить более подробную информацию о том, что вы делаете, но экземпляры Python не хранят методы, они всегда получают их из своего класса. Поэтому, если вы измените метод в классе, существующие экземпляры увидят новый метод.

0 голосов
/ 10 сентября 2010

Мой другой ответ отвечает на ваш первоначальный вопрос, поэтому я оставляю его там, но я думаю, что вам действительно нужна функция reload.

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

Сделайте это после изменения определения класса. Ваш новый метод должен отображаться и использоваться всеми существующими экземплярами вашего класса.

0 голосов
/ 09 сентября 2010

Хорошо, попробую еще раз, но с новым пониманием вопроса:

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

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

Foo.method = new_method
f.method()

напечатает

Before
After

Это будет работать и с классами старого стиля. Ключ изменяет класс, а не переопределяет имя класса.

...