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

2024-10-04 07:29:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个模块,我希望它是动态的,因为任何人都可以相对容易地添加特性。你知道吗

其基本思想是有一个类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的一些子类,其他的一切都由critic框架来处理。你知道吗

然而,仅仅把这些类分配给一些永远不会被使用的东西对我来说是相当难看的。Python中是否存在延迟对象?我可以去掉赋值,并且仍然从基类引用实例化类吗?或者我必须将它分配给某个,否则它将被垃圾收集?你知道吗


Tags: 模块runself框架executedef动态特性
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的继承机制将子类收集到一个列表中,并且您的代码不会出现无用的实例化。你知道吗

好吧,您可以使用发布和订阅模式来实现这一点。大致来说,可能是:

class CriticServer:

    def __init__(self):
        self.clients = []

    def insert_client(self, client):
        self.clients.append(client)

    def execute(self):
        for client in self.clients:
            client.run()

class CriticClient:
    # move what you would inherit from server to here
    def __init__(self, server):
        server.insert_client(self)

class DatabaseCriticClient(CriticClient):
    def run(self):
        pass

class DiskSpaceCriticClient(CriticClient):
    def run(self):
        pass

def main():
    server = CriticServer()
    DiskSpaceCriticClient(server)
    DatabaseCriticClient(server) 
    server.execute()  

因为我对你的项目不太了解,所以我想说,为客户机创建一个基类而不是对服务器进行子分类是一个更好的主意。你知道吗

也许它没有太多的魔法,但它工作得很好,很容易理解和扩展(有时比纯魔法更好)。你知道吗

相关问题 更多 >