定义类时自动注册(但不将其导入任何位置)

2024-09-30 16:19:40 发布

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

我想注册一个类(不是一个实例)当它被创建。。。但没有进口。在

基本上,我想做的是:

How to auto register a class when it's defined

。。。但不必在任何地方导入已注册的类。在

问题是:在我的应用程序的某一点上,我需要运行某些系统命令(让我们坚持重新启动、停止。。。例如)。我已经创建了一个“base”(抽象的mmnnno并不真正看起来)类“Command”和一个“CommandManager”,它将接收一个包含要运行的命令的字符串,为所述命令创建适当的实例,对其进行排队并在需要时(或任何时候)分派命令。“Command”类的所有实例将覆盖实际执行命令的“execute”方法。如果我想“重新启动”,我会扩展“RebootCommand”类上的“Command”类,并覆盖对外部应用程序“shutdown-r”或“reboot”的调用的“execute”。在

最终目标是能够做一些事情,比如:

CommandManager.execute("reboot")

系统会重新启动。在

为此,必须在CommandManager内的字典中注册“reboot”字符串。该字典的键为“reboot”(字符串),值为classRebootCommand。CommandManager将收到字符串“reboot”,将转到它的“commandDictionary”,创建一个RebootCommand类的实例并调用它的execute()方法(从而重新启动系统)。在

比如:

^{pr2}$

为了注册,必须创建RebootCommand类对象,为此,我必须将它导入到某个地方。但我不想。我不需要。我只需要创建RebootCommand类对象,因此它将为Command元类执行__new__方法,这是注册发生的地方(如上面对另一个问题的回答中所详述的)。在

有办法吗?我尝试过将实际的命令(从Command继承的类)导入到__init__.py中,但是如果我创建一个新的命令,我必须将它添加到__init__.py中,并且我希望避免这种情况(这样,另一个程序员可以创建一个新的命令,而不必担心忘记将类添加到__init__.py中)

以下是我的目录结构:

commands/
    __init__.py
    CommandManager.py
    Command.py
    RebootCommand.py

这里,命令和RebootCommand的内容进行注册:

#--------------- Command.py -------------------
def register(newCommand):
    if newCommand and newCommand._command:
        import CommandManager
        CommandManager.CommandManager.registerCommand(newCommand._command, newCommand)


# Fancy registering! https://stackoverflow.com/questions/5189232/how-to-auto-register-a-class-when-its-defined
class CommandMetaClass(type):
    def __new__(cls, clsname, bases, attrs):
        newCommand = super(cls, CommandMetaClass).__new__(cls, clsname, bases, attrs)
        register(newCommand)  # here is your register function
        return newCommand

class Command(object):
    __metaclass__ = CommandMetaClass
    _command = None
#-----------------------------------------------------

还有。。。在

#--------------- RebootCommand.py -------------------
class RebootCommand(Command.Command):
    _command = "reboot"
#---------------------------------------------------

如果我打开__init__.py并写入:

import RebootCommand

(此时将创建RebootCommand类对象

CommandMetaClass.__new__

函数运行,“reboot”注册为RebootCommand类,每个人都很高兴)

但如果可能的话,我想避免这样做(触摸__init__.py

我尝试过用*通配符导入,但运气不好。在

总而言之,我希望另一个想要实现新命令的程序员只需创建一个继承自Command的新类,而不必将它添加到__init__.py

我知道没有什么不能用在命令.py“如果我想从这个文件中继承更多的东西,我可以说”如果我有更多的话。在


Tags: 实例字符串py命令registernewexecuteinit
1条回答
网友
1楼 · 发布于 2024-09-30 16:19:40

问题是:

比特率=(千比特/1000)

这是整数除法,它给出的答案是0

您可能应该将比特率声明为double,然后执行以下操作:

比特率=(千比特/1000.00)

网友
2楼 · 发布于 2024-09-30 16:19:40

问题出在setKiloBits方法中:

public boolean setKiloBits(int kiloBits) {
      if (kiloBits > MIN_BITRATE && kiloBits < MAX_BITRATE){
         bitRate = (kiloBits/1000);
         return true;
      }
      return false;
}

将一个int除以一个int,结果小于1(320/1000=.32等),它将截断余数。试试这个:

public boolean setKiloBits(int kiloBits) {
      if (kiloBits > MIN_BITRATE && kiloBits < MAX_BITRATE){
         bitRate = (kiloBits/1000.0);
         return true;
      }
      return false;
}

然而,当你从千比特转换到比特时,我想你实际上是想乘以1000?但这取决于你的商业逻辑

编辑:正如Alpertmd所指出的,如果您想要除法,您还需要将比特率的定义更改为double

相关问题 更多 >