Hey Paul, thanks for the reply. I tried overriding the __init__ method but I get an error saying that special methods aren't allowed for virtual classes. My conclusion is that I think I'm trying to use virtual classes a bit differently than they were intended. A friend of mine suggested that I try monkey patching as an alternate option, which sounds like it might be a better fit, so I think that's what I'll look into next. Thanks everyone for your replies!
On Tuesday, October 23, 2012 5:53:05 AM UTC+13, elrond79 wrote: > > Ah, I see what you meant now... sorry. I think I forgot myself how the > virtual node creation process worked... =/ > > Anyway, yes, you're right 'newNode' will not yet be an instance of your > new virtual class. However, you can still call methods of your new class - > just pass in the node explicitly: > > MyVirtualClass.myMethod(newNode, arg1, ...) > > However... the *Create stuff are only used when the actual maya node is > created in the scene - and even then, only when created by using a PyNode - > ie, MyVirtualClass(name='foo'). If you want to run something everytime an > instance is created, like a normal __init__... you should still be able to > just override __init__. Just make sure that you make it accept *args and > **kwargs (because you shouldn't make any assumptions about what the > incoming args/kwargs will be), and make sure you call the super __init__. > > - Paul > > On Fri, Oct 19, 2012 at 2:03 PM, Morgan <[email protected] <javascript:> > > wrote: > >> Right, all the pymel methods are available, but in that example, if I add >> a method to CustomJointBase called customMethod and then try to call that >> within _postCreateVirtual like so: >> >> newNode.customMethod() >> >> I get an error because I newNode isn't an instance of my new virtual >> class: >> # AttributeError: nt.Joint(u'leftLeg') has no attribute or method named >> 'customMethod' # >> >> I can call it just fine once the class has been instanced in another >> function or script, just not within the node creation methods of the class >> itself. Is that right? >> >> >> On Saturday, October 20, 2012 8:19:33 AM UTC+13, elrond79 wrote: >> >>> Nope, it's an instance of the class, and you can use it exactly as you >>> would self. Check the example file at: >>> >>> https://github.com/**LumaPictures/pymel/blob/** >>> master/examples/customClasses.**py<https://github.com/LumaPictures/pymel/blob/master/examples/customClasses.py> >>> >>> In it's _postCreateVirtual, it adds an attribute, and calls it's .attr >>> method... >>> >>> - Paul >>> >>> >>> On Fri, Oct 19, 2012 at 12:13 PM, Morgan <[email protected]> wrote: >>> >>>> But that new node is different from self because it's just a node, not >>>> an instance of the class, so although you can act on the node directly, >>>> you >>>> can't call any of the custom methods or set member variables, I don't >>>> think.... >>>> >>>> >>>> On Saturday, October 20, 2012 7:33:39 AM UTC+13, elrond79 wrote: >>>>> >>>>> Morgan - though _postCreateVirtual is indeed a classmethod, when it is >>>>> called by pymel's mechanics, it is always passed in the "newNode" as the >>>>> first argument (after the classmethod-automatically-**crea**ted 'cls' >>>>> arg, of course). So you can use this arg just as you would "self" in a >>>>> "normal" instance method. >>>>> >>>>> - Paul >>>>> >>>> -- >>>> view archives: >>>> http://groups.google.com/**group/python_inside_maya<http://groups.google.com/group/python_inside_maya> >>>> change your subscription settings: http://groups.google.com/** >>>> group/python_inside_maya/**subscribe<http://groups.google.com/group/python_inside_maya/subscribe> >>>> >>> >>> -- >> view archives: http://groups.google.com/group/python_inside_maya >> change your subscription settings: >> http://groups.google.com/group/python_inside_maya/subscribe >> > > -- view archives: http://groups.google.com/group/python_inside_maya change your subscription settings: http://groups.google.com/group/python_inside_maya/subscribe
