【问题标题】:How to instantiate a class given its parent class in Python?如何在 Python 中实例化一个给定其父类的类?
【发布时间】:2020-05-30 21:43:30
【问题描述】:

我有 3 个子类和 1 个父类,使子类共享一个通用方法。

例子:

    class Animal:
      def communicate():
        pass

    class Dog(Animal):
       def communicate():
           bark()

    class Cat(Animal):
        def communicate():
            meow()

我想提供一个 API,它根据接收到的字符串实例化一只猫或一只狗,该字符串将是“猫”或“狗”并调用 .communicate(),但我不想写 if 和其他检查我是否应该运行 Dog() 或 Cat()。我想知道是否可以通过执行以下操作来吠叫或喵喵叫: Animal("dog").communicate()

其中“dog”可以是变量。

或者如果可能的话,给子类一些标签,并能够通过这个标签,甚至通过自己的类名来实例化它们。

我的想法是不必每次定义新的子子类时都编写条件。

提前致谢!

【问题讨论】:

  • 你的代码运行了吗? communicate 方法的 agruments 中的 self 在哪里?很抱歉这么说,但代码不能称为最小的可重现示例。但是你想要的是一个叫做Factory的模式,这里可以有更多的细节github.com/faif/python-patterns/blob/master/patterns/creational/…,你可以适应你的情况的代码。
  • 这只是我用手机写的一个示例代码,我的项目也不是关于动物的。我会检查这家工厂,谢谢!
  • 关于idea不是每次都写条件。这是一个棘手的事情,可以应用元类,或者使用这里的代码示例stackoverflow.com/questions/456672/class-factory-in-python

标签: python python-3.x


【解决方案1】:

Factory pattern 是您的解决方案。

here 描述的自动化条件创建类的方法

我可以展示如何应用元类:

class MetaAnimal(type):
    classes = {}

    def __new__(cls, name, bases, dct):
        result = super().__new__(cls, name, bases, dct)
        cls.classes[name.lower()] = result
        return result

    @classmethod
    def get_animal(cls, name):
        return cls.classes.get(name)


class Animal(metaclass=MetaAnimal):
    def communicate(self):
        pass


class Dog(Animal):
    def communicate(self):
        self.bark()

    def bark(self):
        print('Woof')


class Cat(Animal):
    def communicate(self):
        self.meow()

    def meow(self):
        print('Meow')


MetaAnimal.get_animal('cat')().communicate()
MetaAnimal.get_animal('dog')().communicate()

【讨论】:

  • 这是我在 Python 中看到的最清晰、最干净的工厂模式示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多