#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')