Alex Martelli wrote:
Steven Bethard <[EMAIL PROTECTED]> wrote:
I don't know what the right solution is here... I wonder if I should
write a classmethod-style descriptor that disallows the calling of a function from an instance? Or maybe I should just document that the classmethods should only be called from the class? Hmm...


Another approach is to add a few "reserved words" to the ones Python
itself would reject in the initialization.  Just you cannot do:

    b = Bunch(continue=23)

you may choose to forbid using getDict=42 - if you do that you probably
want to forbid any magicname too, since e.g.

    b = Bunch(__dict__=99)

can't work ``right'' no matter what, while setting e.g. __deepcopy__
similarly might confuse any copy.deepcopy(b), etc, etc.

Yeah, I thought about this. I certainly don't have any problem with disallowing magic names. For other names, I'm less certain...


How do you feel about getDict and setDict also being classmethods?

Uh? I want to get or set the dict of a specific instance -- not those of the whole class. How would you design them as classmethods...?

The classmethod would have to be called with an instance, e.g.:

class Bunch(object):
    @classmethod
    def getDict(cls, self):
        return self.__dict__

    @classmethod
    def setDict(cls, self, dct):
        self.__dict__ = dct

Of course, these could be staticmethods instead since they don't need the class, but the point is that you should be calling them like:

    adict = Bunch.getDict(bunch)

or

    Bunch.setDict(bunch, adict)

The complications with attribute hiding is one of main reasons I've tried to minimize the number of methods associated with Bunch...

Steve
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to