Цель:
- B наследует от A.
- A и B имеют фабричный метод
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")
Это не удается со следующей ошибкой:
Трассировка (последний последний вызов): Файл "test.py", строка 22, в B.create("create_b_style_1") Файл "test.py", строка 10, в create create_method = getattr(sys.modules[__name__], create_method_str) AttributeError: объект «модуль» не имеет атрибута «create_b_style_1»
Таким образом, я пытаюсь объединить три вещи: фабричные методы, наследование и вызов функций по имени. Было бы здорово, если бы у кого-то был более разумный подход или он знал, как заставить этот подход работать.
Большое спасибо!
self
илиcls
в качестве первого аргумента, в зависимости от того, являются ли они методами экземпляра или класса. Вероятно, вы хотите, чтобыcreate
был статическим методом. Возможно, вы также захотите, чтобыcreate
вызывала подфункции, не передавая их имена в виде строк. Это кажется хрупким, хотя бы потому, что вы, возможно, захотите переименовать функции позже, не переучивая своих пользователей. - person Two-Bit Alchemist   schedule 30.10.2015