Можно ли использовать строку для инстанцирования класса?

Есть несколько способов, которыми это может быть достигнуто. Это всего лишь один пример.

Вы можете сделать что-то подобное в своем HTML:

<div ng-if="::loadMe" ng-show="loadMe">foo</div>

Токен "::" означает, что используется одноразовая привязка данных. Таким образом, другими словами, div будет отображаться, когда loadMe истинно. Как только оно становится истинным, оно не будет скрытым, если loadMe станет ложным.

Вы можете установить значение loadMe в обработчике событий вашего контроллера (например, $scope.loadMe = true; внутри обработчика). Например, если вы хотите, чтобы значение изменялось при прокрутке пользователя, вы можете сделать это в обработчике события onscroll.

37
задан martineau 2 December 2018 в 18:50
поделиться

5 ответов

Не уверенный это - то, что Вы хотите, но это походит на большее количество 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>]
17
ответ дан Veltzer Doron 27 November 2019 в 04:21
поделиться

Если бы Вы хотели избежать оценки (), то Вы могли бы просто сделать:

id = "1234asdf"
constructor = globals()[id]
instance = constructor()

При условии, что класс определяется в (или импортируется в), Ваша текущая область.

59
ответ дан dbr 27 November 2019 в 04:21
поделиться

Никогда использование eval(), если можно помочь ему. Python имеет так много более оптимальных вариантов (словарь отправки, getattr(), и т.д.), что Вам никогда не придется использовать дыру в системе безопасности, известную как eval().

8
ответ дан Ignacio Vazquez-Abrams 27 November 2019 в 04:21
поделиться

Самый простой путь состоит в том, чтобы просто создать 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()
6
ответ дан nosklo 27 November 2019 в 04:21
поделиться

Существует некоторый материал, отсутствующий в Вашем вопросе, таким образом, я вынужден предположить опущенный материал. Не стесняйтесь редактировать свой вопрос исправить пропуск.

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) является только проблемой, если кто-то конкретно предоставляет доступ злонамеренным пользователям.

0
ответ дан S.Lott 27 November 2019 в 04:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: