2009-07-27 2 views
4

Предположим, что у меня есть класс C.В Python, каков правильный способ создания экземпляра класса из переменной?

Я могу написать o = C(), чтобы создать экземпляр C и назначить его o.

Однако, если я хочу назначить сам класс в переменную, а затем создать его экземпляр?

Например, предположим, что у меня есть два класса, такие как C1 и C2, и я хочу сделать что-то вроде:

if (something): 
    classToUse = C1 
else: 
    classToUse = C2 

o = classToUse.instantiate() 

Что синтаксис для фактического instantiate()? Достаточно ли позвонить __new__()?

ответ

14
o = C2() 

Это выполнит то, что вы хотите. Или, если вы хотите использовать classToUse, просто используйте:

o = classToUse() 

Надеюсь, это поможет.

+0

Итак, семантика добавления() к переменной означает «рассматривать как класс и создавать экземпляры?». – Uri

+3

() означает «называть это». Вызов класса означает его экземпляр. За кулисами вызов чего-то вызывает метамод __call__, который вы можете использовать, чтобы сделать, например, экземпляры класса * *. – Cide

+0

В предыдущем комментарии должен быть, вероятно, '__call __()'. (Надеюсь, что форматирование работает на этот раз.) –

1

Это просто, Python не распознает, где varible является классом или функцией. Это просто называют это значение.

class A: 
    pass 
B=A 
b=B() 
10

Вы почти у цели. Вместо вызова метода instantiate() просто вызовите переменную напрямую. Он присваивается класс, и классы могут быть отозваны:

if (something): 
    classToUse = C1 
else: 
    classToUse = C2 

o = classToUse() 
0

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

def f(): print "foo" 

class C: pass 

x = f 
x() # prints foo 

x = C 
instance = x() # instanciates C 
Смежные вопросы