0

クラスを作業して更新するときに、既に作成されているクラス インスタンスを更新する必要があります。どうすればそれを行うことができますか?

class MyClass:
"""  """

def __init__(self):

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

classInstance = MyClass()

Maya 内で Python を実行すると、ソフトウェアの起動時にインスタンスが作成されます。classInstance.myMethod() を呼び出すと、これを変更しても常に「hello」が出力されます。

ありがとうございました、

/キリスト教徒

より完全な例:

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 を再起動する必要があることです(それらは引き続き un を使用します)。 -変更された方法)。

4

3 に答える 3

1

わかりました、もう一度やり直しますが、質問を新たに理解してください:

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

これは、古いスタイルのクラスでも機能します。重要なのは、クラスの名前をオーバーライドするのではなく、クラスを変更することです。

于 2010-09-09T18:49:34.783 に答える
0

何をしているかについての詳細を提供する必要がありますが、Python インスタンスはメソッドを保存するのではなく、常にクラスから取得します。したがって、クラスのメソッドを変更すると、既存のインスタンスに新しいメソッドが表示されます。

于 2010-09-09T19:04:30.540 に答える
0

私の他の答えはあなたの元の質問に答えるので、そこに残しますが、あなたが本当に欲しいのはreload機能だと思います.

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

クラス定義を変更した後にそれを行います。新しいメソッドが表示され、クラスの既存のすべてのインスタンスで使用されるはずです。

于 2010-09-10T13:07:36.150 に答える