Указатель NULL
- это тот, который указывает на никуда. Когда вы разыскиваете указатель p
, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p
является нулевым указателем, местоположение, хранящееся в p
, является nowhere
, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception
.
В общем, это потому, что что-то не было правильно инициализировано.
В Python
className = MyClass
newObject = className()
первая строка делает переменную className
, называют то же самое MyClass
. Тогда следующая строка звонит MyClass
конструктор через className
переменная.
Как конкретный пример:
>>> className = list
>>> newObject = className()
>>> newObject
[]
(В Python, list
конструктор для list
класс.)
различие - то, что в PHP, Вы представляете название класса, который Вы хотите назвать строкой, в то время как в Python можно сослаться на тот же класс непосредственно. Если Вы должны использовать строку (например, если название класса будет создано динамично), то необходимо будет использовать другие методы.
Предположение, что 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
последний метод является, вероятно, самым безопасным способом сделать это, таким образом, это, вероятно, что необходимо использовать если вообще возможный.
Если у Вас есть это:
class MyClass:
def __init__(self):
print "MyClass"
Тогда Вы обычно делаете это:
>>> x = MyClass()
MyClass
, Но Вы могли также сделать это, которое является тем, что я думаю, что Вы спрашиваете:
>>> a = "MyClass"
>>> y = eval(a)()
MyClass
, Но, быть очень осторожными относительно того, где Вы получаете строку, что Вы используете "оценку ()" на - если это прибыло от пользователя, Вы по существу создаете огромную дыру в системе безопасности.
Обновление: Используя type()
как показано в ответе coleifer далеко превосходит это решение.
Если вам нужно создать динамический класс в Python (т.е. тот, имя которого является переменной), вы можете использовать type (), который принимает 3 параметра: name, base, attrs
>>> class_name = 'MyClass'
>>> klass = type(class_name, (object,), {'msg': 'foobarbaz'})
<class '__main__.MyClass'>
>>> inst = klass()
>>> inst.msg
foobarbaz