在Python 3中,在init之前通过名称调用类函数继承

时间:2015-10-29 21:35:06

标签: python-3.x inheritance factory-pattern getattr

目标:

  • B继承自A。
  • A和B有一个工厂方法create,它在初始化实际类之前协调不同的输入类型。
  • create通过名称调用不同的创建方法create_general_1create_general_2create_specific_b_1,以字符串形式提供。

这是我目前的做法:

import sys

class A:
    def __init__(self, text):
        self.text = text
        print("I got initialized: {}".format(text))

    def create(create_method_str):
        # This is where it breaks:
        create_method = getattr(sys.modules[__name__], create_method_str)
        return create_method()

    def create_general_style_3():
        return A("a, #3")

class B(A):
    def create_b_style_1():
        return B("b, #1")

if __name__ == "__main__":
    B.create("create_b_style_1")

失败并出现以下错误:

  

Traceback(最近一次调用最后一次):文件“test.py”,第22行,in    B.create(“create_b_style_1”)文件“test.py”,第10行,in   create create_method = getattr(sys.modules [__ name __],   create_method_str)AttributeError:'module'对象没有属性   'create_b_style_1'

所以在某种程度上,我试图结合三件事:工厂方法,继承和按名称调用的函数。 如果有人采用更聪明的方法,或者知道如何使这种方法起作用,那就太好了。

非常感谢!

1 个答案:

答案 0 :(得分:1)

感谢Two-Bit Alchemist的评论,我创建了这个解决方案,看起来效果很好。任何改进/其他建议都非常受欢迎:)

所有问题都得到了很好的解释here

import sys

class A:
    def __init__(self, text):
        self.text = text
        print("I got initialized: {}".format(text))

    @classmethod
    def create(cls, create_method_str):
        create_method = getattr(cls, create_method_str)
        return create_method()

    @classmethod
    def create_general_style_3(cls):
        return cls("a, #3")

class B(A):
    @classmethod
    def create_b_style_1(cls):
        return cls("b, #1")

if __name__ == "__main__":
    B.create("create_b_style_1")