当我工作并更新一个类时,我想要一个已经创建的类实例进行更新。我该怎么做呢?
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())。 类中有很多方法,所以我删除它们以缩短滚动:-) 在类之上还有import语句,但由于某种原因它们搞砸了格式。他们在这里:
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 - 修改方法)。
答案 0 :(得分:0)
好的,再试一次,但对这个问题有了新的理解:
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
这也适用于旧式类。关键是修改类,而不是覆盖类的名称。
答案 1 :(得分:0)
您必须提供有关您正在做的事情的更多详细信息,但Python实例不存储方法,它们总是从类中获取它们。因此,如果您更改类上的方法,现有实例将看到新方法。
答案 2 :(得分:0)
我的另一个答案回答了你原来的问题,所以我将它留在那里,但我认为你真正想要的是reload
函数。
import our_maya.mayaCore
reload(our_maya.mayaCore)
from our_maya.mayaCore import *
更改类定义后执行此操作。您的新方法应该出现并被您班级的所有现有实例使用。