I created a class String() with __get__(), __set__(), and a method to_db(); however, when I do name = String(), I can't do self.name.to_db() because it's calling to_db() on the value returned by __get__(), not the object "name". 
class String(object):
    def __init__(self, value=None):
        if value:
            self.value = str(value)
    def __get__(self, instance, owner):
        return self.value
    def __set__(self, instance, value):
        self.value = str(value)
    def to_db(self):
        return {'type':'string', 'value': self.value}
class Example(object):
    name = String()
    age = Integer()
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def save():
        data = dict(name=self.name.to_db(), age=self.age.to_db())
        db.save(data)
One way to deal with this is to not call self.name.to_db() directly and instead set a flag in instance and create a conditional in __get__() to check for it and call to_db() if it's True, but this seems kludgy. Is there a better way?
Also, I'm new to descriptors -- what are the pros/cons of using instance and/or instance.__dict__ to store state vs storing it in self?
It's pretty easy - just have your descriptor return a subclass of string with the extra method(s) you want.
def __get__(self, instance, owner):
    class TaggedString(str):
        def to_db(self):
            return {'type':'string', 'value': self}
    return TaggedString(self.value)`
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With