我正在研究一个我希望有点动态的模块,因为任何人都可以相对容易地添加功能。
基本思想是拥有一个类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中存在拖延对象这样的事情吗?我可以取消赋值,并且仍然可以引用基类中的实例化类吗?或者我必须将它分配给某些东西,否则它将被垃圾收集?
答案 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的继承机制将子类收集到列表中,并且您的代码没有无用的实例化。