Есть несколько способов, которыми это может быть достигнуто. Это всего лишь один пример.
Вы можете сделать что-то подобное в своем HTML:
<div ng-if="::loadMe" ng-show="loadMe">foo</div>
Токен "::" означает, что используется одноразовая привязка данных. Таким образом, другими словами, div
будет отображаться, когда loadMe
истинно. Как только оно становится истинным, оно не будет скрытым, если loadMe
станет ложным.
Вы можете установить значение loadMe
в обработчике событий вашего контроллера (например, $scope.loadMe = true;
внутри обработчика). Например, если вы хотите, чтобы значение изменялось при прокрутке пользователя, вы можете сделать это в обработчике события onscroll
.
Не уверенный это - то, что Вы хотите, но это походит на большее количество Pythonic способ инстанцировать набора классов, перечисленных в строке:
class idClasses:
class ID12345:pass
class ID01234:pass
# could also be: import idClasses
class ProcessDirector:
def __init__(self):
self.allClasses = []
def construct(self, builderName):
targetClass = getattr(idClasses, builderName)
instance = targetClass()
self.allClasses.append(instance)
IDS = ["ID12345", "ID01234"]
director = ProcessDirector()
for id in IDS:
director.construct(id)
print director.allClasses
# [<__main__.ID12345 instance at 0x7d850>, <__main__.ID01234 instance at 0x7d918>]
Если бы Вы хотели избежать оценки (), то Вы могли бы просто сделать:
id = "1234asdf"
constructor = globals()[id]
instance = constructor()
При условии, что класс определяется в (или импортируется в), Ваша текущая область.
Никогда использование eval()
, если можно помочь ему. Python имеет так много более оптимальных вариантов (словарь отправки, getattr()
, и т.д.), что Вам никогда не придется использовать дыру в системе безопасности, известную как eval()
.
Самый простой путь состоит в том, чтобы просто создать dict.
class A(object):
pass
class B(object):
pass
namedclass = {'ID12345': A, 'ID2': A, 'B': B, 'AnotherB': B, 'ID01234': B}
Затем использование это (Ваш пример кода):
IDS = ["ID12345", "ID01234"]
ProcessDirector = ProcessDirector()
for id in IDS:
builder = namedclass[id]()
ProcessDirector.construct(builder)
builder.run()
Существует некоторый материал, отсутствующий в Вашем вопросе, таким образом, я вынужден предположить опущенный материал. Не стесняйтесь редактировать свой вопрос исправить пропуск.
class ProcessDirector( object ):
# does something
class ID12345( SomeKindOfProcess ):
pass
class ID001234( SomeKindOfProcess ):
pass
idList= [ID12345, ID01234]
theProcessDirector = ProcessDirector()
for id in idList:
builder = id() #Instantiate an object from the class object
theProcessDirector.construct(builder)
builder.run()
Это работает очень приятно. Это не инстанцирует от строки - на практике Вы не часто хотите это. Иногда, но редко. Чаще всего, Вы список объектов класса, от которых Вы хотите объекты экземпляра.
, Если бы Вы на самом деле получаете свои имена классов от командной строки, затем Вы сделали бы следующее небольшое изменение.
validClasses = [ ID12345, ID01234 ]
validMap = dict( ( (c.__name__, c) for c in validClasses ) )
nameStrings = [ "ID12345", "ID01234" ] # from your command-line
idList= [ validMap[s] for s in nameStrings ]
Все остальное остается тем же.
[Кроме того, если это возможно, попытка запустить имена переменной экземпляра со строчных букв. Имена, которые запускаются с Прописных букв, являются обычно именами классов.]
Редактирование
Удаленный eval
. Несмотря на то, что eval()
абсолютно не дыра в системе безопасности. Оценка (и exec
и execfile
) является только проблемой, если кто-то конкретно предоставляет доступ злонамеренным пользователям.