目标:
create
,它在初始化实际类之前协调不同的输入类型。create
通过名称调用不同的创建方法create_general_1
,create_general_2
,create_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'
所以在某种程度上,我试图结合三件事:工厂方法,继承和按名称调用的函数。 如果有人采用更聪明的方法,或者知道如何使这种方法起作用,那就太好了。
非常感谢!
答案 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")