Python 覆盖回调以避免属性污染

Python 覆盖回调以避免属性污染,python,asynchronous,Python,Asynchronous,我有一个类,它有一些回调和自己的接口,比如: class Service: def __init__(self): connect("service_resolved", self.service_resolved) def service_resolved(self, a,b c): ''' This function is called when it's triggered service resolve

我有一个类,它有一些回调和自己的接口,比如:

class Service:
     def __init__(self):
         connect("service_resolved", self.service_resolved)

     def service_resolved(self, a,b c):
         ''' This function is called when it's triggered 
             service resolved signal and has a lot of parameters'''
例如,connect函数是gtkwidget.connect,但我希望此连接更通用,因此我决定使用“类似扭曲”的方法:

class MyService(Service):

   def my_on_service_resolved(self, little_param):
          ''' it's a decorated version of srvice_resolved '''
   def service_resolved(self,a,b,c):
       super(MyService,self).service_resolved(a,b,c)
       little_param = "something that's obtained from a,b,c"
       self.my_on_service_resolved(little_param)
所以我可以通过覆盖我的服务来使用MyService

问题在于“属性”污染。在实际实现中,服务具有一些属性,这些属性可能会意外地在MyService和MyService子类中被覆盖

如何避免属性污染

我认为这是一种类似“包装器”的方法,但我不知道这是否是一个好的解决方案:

class WrapperService():
    def __init__(self):
        self._service = service_resolved
        # how to override self._service.service_resolved callback?
    def my_on_service_resolved(self,param):
        '''
        '''

避免与派生类发生意外冲突是存在“双前导下划线”命名方法的原因:如果在class
Service
中命名属性,Python编译器将在内部将该名称“扭曲”为
\uuuuufoo
,从而不可能发生意外冲突。唉,并非不可能:一个子类也可能被命名为
Service
(并存在于另一个模块中),并且还具有自己的
\uuufoo
属性。。。这将被命名为完全相同的方式,导致冲突再次发生。改进包括命名基类
BaseService
等,利用派生类不太可能命名为
base
之类的事实。但是,最终,除了清楚地记录这样一个约定之外,别无选择(至少如果子类将由几乎没有Python经验的程序员编写的话)

我认为“意外冲突”问题不足以迫使您完全放弃子类化(支持使用独占包装),这基本上是避免意外名称冲突的唯一方法。您称之为“twisted-like”的方法(实际上是模板方法设计模式的一个例子)是非常可行的,并且在实际实践中,命名约定和设计选择文档的混合证明足以避免其“冲突”风险