我想编写一个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
应该是实际的代码类(PhotoTag
或AlbumTag
,也许是NoteTag
,{{1等等)
我怎么能做好这个的设计呢?感谢。
答案 0 :(得分:0)
你想要的课程来自哪里?如果它只是“与self
参数相同的类”,那么您只需调用self.get(tag_id)
即可。它会通过传递self类来调用类方法get()
。但显式优于隐式:您也可以调用self.__class__.get(tag_id)
。