Как ссылаться на схему элементов класса в качестве аргумента в функции при указании аргументов класса?

#python #python-3.x #parameter-passing

#python #python-3.x #передача параметров

Вопрос:

Ниже приведена настройка.

 class SomeClass():
    def __init__(self):
        pass

    def some_func1(self, paramA):
        some_input = paramA
        print(some_input)

class SomeOtherClass():
    def __init__(self, param1, param2):
        self.param1 = param1
        self.param2 = param2

obj = SomeClass()

# Scenario #1
some_var = obj.some_func1(paramA=SomeOtherClass)
# <class '__main__.SomeOtherClass'>

# Scenario #2
some_other_var = obj.some_func1(paramA=SomeOtherClass(param1='val1', param2='val2'))
# <__main__.SomeOtherClass object at 0x000002576E88FD60>
  

Проблема в том, что в моем реальном примере ни одна из этих двух конфигураций не работает. В сценарии # 1 SomeOtherClass ссылка на аргумент some_func1 ‘s paramA . В сценарии № 2 были указаны требуемые аргументы для создания экземпляра SomeOtherClass , но проблема в том, что я НЕ хочу создавать его на уровне аргументов.

Как я могу ссылаться (а не создавать экземпляр) на SomeOtherClass с указанными значениями параметров в качестве значения аргумента функции?

Комментарии:

1. Что вы хотите, чтобы это на самом деле делало? Т.е. После того, как у вас есть класс и параметры, что вы хотите с ними делать, если на самом деле не создавать экземпляр объекта?

2. Я просто хочу SomeOtherClass , чтобы ссылка на с указанными значениями параметров использовалась в качестве аргумента функции. Я хочу позже создать его экземпляр some_func1 .

3. Тогда, может быть, просто передать thunk ( lambda выражение), которое создает объект? Я напишу ответ, демонстрирующий это.

Ответ №1:

Простой способ отложить оценку чего-либо (включая создание экземпляра объекта) — обернуть это в lambda :

 class SomeClass():
    def some_func1(self, thunk):
        """thunk: a callable that takes no args and constructs an object."""
        print(thunk)
        obj = thunk()  # this actually instantiates the object
        print(obj)


class SomeOtherClass():
    def __init__(self, param1, param2):
        self.param1 = param1
        self.param2 = param2

obj = SomeClass()

some_var = obj.some_func1(lambda: SomeOtherClass('val1', 'val2'))
  

Если вам нужен класс и параметры как отдельные аргументы для какой-либо другой цели, вы могли бы сделать:

 def some_func1(self, obj_class, *params):
    print(obj_class, params)
    obj = obj_class(*params)
    print(obj)

some_func1(SomeOtherClass, 'val1', 'val2')