Python - 一种实例化类的方法,而不是分配它?

时间:2015-07-17 13:44:49

标签: python object

我正在研究一个我希望有点动态的模块,因为任何人都可以相对容易地添加功能。

基本思想是拥有一个类CriticBase,它可以处理对此部署的所有批评。 critics是从CriticBase继承的任何类。

伪示例:

class CriticBase(Object) { 
    def self.Execute(): 
        for critic in self.__subclasses__: critic.run()
}

class DatabaseCritic(CriticBase) { def run( //things ) }
class DiskSpaceCritic(CriticBase) { def run( //things ) }
etc...

def DoWork():
    Controller = CriticBase()
    a = DatabaseCritic()
    b = DiskSpaceCritic()
    ...
    Controller.Execute()

我希望那种有道理。基本上,我们的想法是拥有一个对其他开发者来说相当简单的框架。您需要做的就是定义CriticBase的一些子类,其他一切由批评框架为您处理。

但是,将这些类分配给永远不会被使用的东西对我来说非常难看。 Python中存在拖延对象这样的事情吗?我可以取消赋值,并且仍然可以引用基类中的实例化类吗?或者我必须将它分配给某些东西,否则它将被垃圾收集?

2 个答案:

答案 0 :(得分:2)

嗯,您可以使用发布和订阅模式实现此目的。粗略地说,它可能是:

override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationController?.navigationBarHidden = true
}

由于我不太了解您的项目的细节,我很想说为客户创建基类而不是对服务器进行子类化会更好。

也许它没有太多的魔法,但它很好用,很容易理解和扩展(有时候比纯魔法更好)。

答案 1 :(得分:2)

我的理解是你不希望其他开发人员实例化子类。实际上,只要方法run()是类方法,它们就不需要这样做:

# The framework provides this base class
class CriticBase(object):
    @classmethod
    def execute(cls): 
        for critic_class in cls.__subclasses__(): 
            critic_class.run()

# Devs only need to provide a definition of subclass
class DatabaseCritic(CriticBase):
    @classmethod
    def run(cls):
       # do something specific about database

class DiskSpaceCritic(CriticBase):
    @classmethod
    def run(cls):
       # do something specific about disk space

# now the base class do all the work
def DoWork():
    CriticBase.execute()

使用这种方法,您可以使用python的继承机制将子类收集到列表中,并且您的代码没有无用的实例化。