当扩展(插件)想要更改表示本地存储库的对象时,在Mercurial(分布式修订控制系统)中对此类实例进行重分类。该对象被调用
repo,并且最初是一个
localrepo实例。它依次传递给每个扩展,并在需要时扩展将定义一个新类,该新类是该子类的子类,
repo.__class__并将其类
更改
repo为该新子类!
在代码中看起来像这样:
def reposetup(ui, repo): # ... class bookmark_repo(repo.__class__): def rollback(self): if os.path.exists(self.join('undo.bookmarks')): util.rename(self.join('undo.bookmarks'), self.join('bookmarks')) return super(bookmark_repo, self).rollback() # ... repo.__class__ = bookmark_repo
扩展名(我从书签扩展名中获取了代码)定义了一个名为的模块级函数
reposetup。在初始化扩展并传递
ui(用户界面)和
repo(存储库)参数时,Mercurial将调用此方法。
然后,该函数定义
repo碰巧是任何类的子类。这将 不
足够简单的子类
localrepo,因为扩展需要能够延长对方。因此,如果第一个扩展名更改
repo.__class__为
foo_repo,则下一个扩展名应更改
repo.__class__为的子类,
foo_repo而不仅仅是的子类
localrepo。最后,该函数将更改instanceø的类,就像您在代码中所做的一样。
我希望这段代码可以显示对该语言功能的合法使用。我认为这是我在野外看到它的唯一地方。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)