Для достижения этого поведения вы должны использовать globals()
встроенный метод :
def var_of_var(k, v):
globals()[k] = v
print variable_name # NameError: name 'variable_name' is not defined
some_name = 'variable_name'
globals()[some_name] = 123
print variable_name # 123
some_name = 'variable_name2'
var_of_var(some_name, 456)
print variable_name2 # 456
Основным преимуществом инъекции конструктора является то, что он позволяет вашим полям быть отмеченными окончательными. Например:
class Foo {
private final Bar _bar;
Foo(Bar bar) {
_bar=bar;
}
}
На следующей странице есть отличный список про и con: Guice Best Practices :
Метод инъекции
Инъектор конструктора
Если вы вводите во время методов, чем вы не различаете поведенческую абстракцию от конкретных зависимостей. Это большой нет нет :). Вы хотите зависеть от абстракций, чтобы не сочетаться с зависимостями зависимостей ваших классов. , ,
Поскольку ваш конструктор не будет присутствовать в каком-либо интерфейсе, который поддерживает ваш конкретный класс, чем вы не связаны с этой зависимостью. Но вызов метода будет иметь эту проблему.
Вот хорошая статья об этом типике:
http://chrisdonnan.com/blog/2007/05/20 / захват-через-экстремально-композиция клея-часть-2 /
Не добавляя зависимость от каждого метода, вы затем заставляете каждого вызывающего пользователя знать или извлекать зависимость.
Также с точки зрения инструментария доступно множество доступных фреймворков (по крайней мере, в .NET), которые позволяют или сделать инъекцию конструктора намного проще. Это не должно влиять на решение, но делает его гораздо более привлекательным.
Удачи.
Сумасшедший Боб Ли говорит, что, когда это возможно, использует инъекцию конструктора. Используйте только инъекцию метода, когда у вас нет контроля над экземпляром (например, в сервлете).
Другим методом является пользователь, устанавливающий для зависимостей. Иногда это сочетается с инъекцией конструктора. Это может быть полезно, если вы хотите изменить версию, которую вы используете позже, без необходимости повторного создания экземпляра.
public interface IFoo
{
void Do();
}
public class IFoo DefaultFoo : IFoo
{
public void Do()
{
}
}
public class UsesFoo
{
private IFoo foo;
public IFoo Foo
{
set { this.foo = value; }
}
public UsesFoo()
{
this.Foo = new DefaultFoo();
}
public UsesFoo( IFoo foo )
{
this.Foo = foo;
}
public void DoFoo()
{
this.Foo.Do();
}
}