Damon Timm wrote:
Sorry for the double post!  Went off by mistake before I was done ...

Anyhow, I would like to have a tuple defined at the beginning of my
code that includes classes *before* they are defined ... as such (this
is on-the-fly-hack-code just for demonstrating my question):


What you want to do can be done with a helper function (e.g. Sync.find_sync() below), but I smelled a bad class design. Anyway, here is how you would do it...

class Video(object):
    url = '...'
    def sync(self):
        sync = Sync.find_sync(self.url)

class Sync(object):
    class NoSuitableSync(Exception): pass

    @staticmethod
    def find_sync(url):
        for S in Sync.__subclasses__():
            if S.RE.match(url):
                return S(url)
        raise Sync.NoSuitableSync()

class SyncYoutube(Sync):
    RE = re.compile(r'some regex here')
class SyncBlip(Sync):
    RE = re.compile(r'other regex here')


what I suggest you could do:

class Video(object):
    # Video is a mixin class
    def __init__(self, url):
        self.url = url
    def sync(self):
        # source agnostic sync-ing or just undefined
        pass
    @staticmethod
    def find_video(url):
        for sc in Video.__subclasses__():
            if sc.RE.match(url)
                return sc(url)
class Youtube(Video):
    RE = re.compile('... some regex here ...')
    def sync(self):
        # costum sync-ing
        pass
class Blip(Video):
    RE = re.compile('... other regex here ...')
    def sync(self):
        # costum sync-ing
        pass
a = Video.find_video('http://www.youtube.com/xxxx')

that way, url detection will only happen on class initialization instead of every time sync is called.

_______________________________________________
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor

Reply via email to