2011-09-12 35 views
4

我有一个泛型类(A)这是被继承了很多像这样运行:避免如果__name__ ==“__main__”在Python子类使用功能从父

class A: 
    def run(self): 
     ... 
     self.do_something() 
     ... 

    #abstract function 
    def do_something(self): 
     pass 


class B(A): 
    def do_something(self): 
     ... 

子类是我正在通过将此代码添加到每个文件直接运行单独的文件(B是子类的文件名):

if __name__ == '__main__': 
    B().run() 

我的问题是,我能避免这个代码添加到所有文件与子类,因为代码中唯一改变的是正在使用的类(在这个例子中是B)?

+0

顺便说一句,你可以用'@ abc.abstractmethod'强制执行的要求,即'do_something' _actually_是抽象的。 – katrielalex

+0

是的,我知道,我真的使用它,只是不想让这个例子比需要的更复杂......但反正! – fvieira

回答

8

如果您的python版本足够新,您可以创建一个类装饰器。

在这种情况下,一个间接的。如果你定义runifmain()集中的地方

def runifmain(mainname): 
    def deco(clas): 
     if mainname == '__main__': 
      clas().run() 
     return clas 
    return deco 


@runifmain(__name__) 
class B(A): 
    [...] 

应该做的工作,只是使用@runifmain(__name__)任何需要它。

+0

非常有趣,我之前使用过装饰器,但并不认为它们很容易使用。尽管如此,除非有方法将装饰器放入类A中,否则我仍然必须在每个子类文件中添加导入和装饰器,这听起来不像以前那么简单。如果我的声望足够高,这还是值得我高兴的! xD – fvieira

+0

我现在有足够的声望,有你的投票!再次! – fvieira

+0

thx :-)但是你只需要将装饰器放在一个文件中,并且可以将它导入到单个文件中。如果你用'@ staticmethod'装饰它,甚至应该有一种方法将它放入类定义本身。 – glglgl

2

如何在主类A中添加额外的功能?

class A(): 
    .. 
    def __RunIfMain__(self,name): 
     if name == '__main__': 
      self.run() 

在子类中,你就必须一行少:

class B(A): 
    .. 

B().__RunIfMain__(__name__) 
+1

嗯,你让我少了一行,这是肯定的,但从glglgl的答案装饰看起来更性感...... xD 反正! – fvieira

相关问题