怎么写这个mixin?

时间:2013-12-24 03:21:27

标签: python oop design-patterns

我想编写一个mixin TagMixin,它为对象添加标记功能,用法如下:

 class Photo(TagMixin): 
     kind = 'photo'

 class Album(TagMixin):
     kind = 'album'

问题在于有几种标签:

class Tag(object):
    table = None

    @classmethod
    def get(cls, id):
        r = mysql.execute('select * from %s', cls.table)
        return cls(*r[0]))

    def url(self):
        return NotImplemented

class PhotoTag(Tag):
    table = 'photo_tag' 

    def url(self):
        return '/photo/tag/%s' % self.id

class AlbumTag(Tag):
    table = 'album_tag'

    def url(self):
        return '/album/tag/%s' % self.id

并在撰写mixin时:

class TagMixin(object):

    kind = None

    def get_tags(self):
        tag_ids = mysql.execute('select tag_id from %s_tag_relation where id=%s', (self.kind, self.id))
        return [**Tag**.get(tag_id) for tag_id in tag_ids]

这就是问题所在:

最后一行代码中的

return [**Tag**.get(tag_id)Tag应该是实际的代码类(PhotoTagAlbumTag,也许是NoteTag,{{1等等)

我怎么能做好这个的设计呢?感谢。

1 个答案:

答案 0 :(得分:0)

你想要的课程来自哪里?如果它只是“与self参数相同的类”,那么您只需调用self.get(tag_id)即可。它会通过传递self类来调用类方法get()。但显式优于隐式:您也可以调用self.__class__.get(tag_id)