Использование переменных для имен классов в Python?

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

36
задан Konrad Rudolph 20 May 2010 в 15:16
поделиться

4 ответа

В Python

className = MyClass
newObject = className()

первая строка делает переменную className, называют то же самое MyClass. Тогда следующая строка звонит MyClass конструктор через className переменная.

Как конкретный пример:

>>> className = list
>>> newObject = className()
>>> newObject
[]

(В Python, list конструктор для list класс.)

различие - то, что в PHP, Вы представляете название класса, который Вы хотите назвать строкой, в то время как в Python можно сослаться на тот же класс непосредственно. Если Вы должны использовать строку (например, если название класса будет создано динамично), то необходимо будет использовать другие методы.

24
ответ дан Greg Hewgill 27 November 2019 в 05:19
поделиться

Предположение, что some_module имеет класс, названный "class_name":

import some_module
klass = getattr(some_module, "class_name")
some_object = klass()

я должен отметить, что необходимо быть осторожными здесь: превращение строк в код может быть опасным, если строка прибыла от пользователя, таким образом, необходимо иметь в виду безопасность в этой ситуации.:)

Еще один метод (предполагающий, что мы все еще используем "class_name"):

class_lookup = { 'class_name' : class_name }
some_object = class_lookup['class_name']()  #call the object once we've pulled it out of the dict

последний метод является, вероятно, самым безопасным способом сделать это, таким образом, это, вероятно, что необходимо использовать если вообще возможный.

54
ответ дан Jason Baker 27 November 2019 в 05:19
поделиться

Если у Вас есть это:

class MyClass:
    def __init__(self):
        print "MyClass"

Тогда Вы обычно делаете это:

>>> x = MyClass()
MyClass

, Но Вы могли также сделать это, которое является тем, что я думаю, что Вы спрашиваете:

>>> a = "MyClass"
>>> y = eval(a)()
MyClass

, Но, быть очень осторожными относительно того, где Вы получаете строку, что Вы используете "оценку ()" на - если это прибыло от пользователя, Вы по существу создаете огромную дыру в системе безопасности.

Обновление: Используя type() как показано в ответе coleifer далеко превосходит это решение.

6
ответ дан TimB 27 November 2019 в 05:19
поделиться

Если вам нужно создать динамический класс в Python (т.е. тот, имя которого является переменной), вы можете использовать type (), который принимает 3 параметра: name, base, attrs

>>> class_name = 'MyClass'
>>> klass = type(class_name, (object,), {'msg': 'foobarbaz'})

<class '__main__.MyClass'>

>>> inst = klass()
>>> inst.msg
foobarbaz
  • Обратите внимание, однако, что это не создает экземпляр объекта (т.е. не вызывает конструкторы и т. д.). Он создает новый (!) класс с тем же именем.
22
ответ дан 27 November 2019 в 05:19
поделиться
Другие вопросы по тегам:

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