【问题标题】:How Invoke python class using metaclass and command line如何使用元类和命令行调用 python 类
【发布时间】:2019-12-20 17:32:23
【问题描述】:

此刻我有这样的感觉:

from abc import ABCMeta, abstrachmethod

class MainClass(metaclass=ABCMeta):
  def __init__(self, args):
    print(work)

  def do(self):
    print("Do")

  @abstractmethod
    def todo(self):
      "comment"

class A(MainClass):
  def __init__(self,args):
    super(MainClass,self).__init__()

  def todo(self):
    print("nanananananana batman!")

class B(MainClass):
  def __init__(self,args):
    super(MainClass,self).__init__()

  def todo(self):
    print("Spaghetti code!")
    self.do()

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("-variable", default=1)
    parser.add_argument("-because",default="non important")
    args = parser.parse_args()
    if args.variable == 1:
       foo = A(args)
       foo.todo()
    elif args.variable == 2:
       foo = B(args)
       foo.todo()

调用这个类的更好方法,依赖于命令行?我考虑了模式策略,但我不确定它是如何实现的。 以后我会有更多的课。

【问题讨论】:

    标签: python metaclass


    【解决方案1】:

    抽象基类旨在阐明大型代码库中类和方法的语义,并在基类中充当运行时强制“注释”,即某些方法必须在派生类中实现。

    鉴于您的代码示例,您似乎仍在学习在 Python 和一般编程中使用 class 和相关结构。可以肯定地说,您的代码不需要使用 abc 或 ABCMeta,当您牢牢掌握类和对象的工作原理后,您可以重新使用它们。

    只需将所有内容都省略掉 - 编写代码,不要从 abc 导入任何内容,不要 @abstractmethod 装饰器,也不要在这一点上声明 metaclass= - 您可能在您正在关注的一些示例代码中看到了这些内容,但他们在这个阶段不会有任何好处。

    综上所述,上面的代码会被破坏(如果你修复了缩进语法,这会使它立即变得更加破坏) - @abstractmethod 的想法正是在一个类中不应该存在抽象方法被实例化。它仅用于在基类上标记必须在派生类中重写(覆盖)的方法。所以你的类“A”和“B”不应该有todo方法被装饰成“抽象”这样运行。

    此外,当您在其中执行 self.todo() 时,您正在一个直接的无限递归循环中从您的 B.todo 方法调用它自己。正确的模式应该是super().todo()

    【讨论】:

    • 哦。对不起,我在重写代码时犯了一些错别字。我解决了这个问题,现在应该是正确的。我的问题仍然没有答案 - 如何避免使用:if args.variable==1:
    • 至于根据传递的参数创建实例,如果你总是传递args并以相同的方式使用对象,则只能在条件内选择要使用的类:@987654332 @,并在if/elif 正文之外添加foo = cls(args); foo.todo()。如果在这种情况下您根本不需要 if/elif,您可以使用字典将 arg 值映射到所需的类:config = {1: A, 2: B}; foo = config[args.value](args); foo.todo()
    猜你喜欢
    • 2015-10-01
    • 2013-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多