2009-12-08 2 views
1

Некоторые коды.Что делает первый аргумент для `type`?

In [1]: A = type('B',(), {}) 

In [2]: a = A() 

In [3]: b = B() 
--------------------------------------------------------------------------- 
NameError         Traceback (most recent call last) 

/home/shabda/<ipython console> in <module>() 

NameError: name 'B' is not defined 

Что первый аргумент type здесь делает?

ответ

2

Это установкой __name__ свойства созданного класса.

Когда вы говорите:

class B(object): 

две вещи происходят с этой 'B':

  • Название 'B' присваивается класс. Это так, как если бы вы сказали «B = ...».

  • Свойство класса __name__ имеет значение 'B'.

При вызове конструктора типов вручную производится только последняя половина. Если вы не присвоите результат «B», тогда B останется установленным (или отмененным), как было раньше.

Заметим, что аналогичный результат можно получить, говоря:

class B(object): 
    pass 
A = B 
del B 

Теперь относится к классу, который называет себя «B», и B не относится ни к чему.

0

Это создает новый класс с именем B:

Python 2.5.4 (r254:67916, Nov 19 2009, 22:14:20) 
[GCC 4.3.4] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> type('B',(), {}) 
<class '__main__.B'> 

Смотрите вторую форму typehere для получения дополнительной информации.

Когда вы назначаете результат вызова type переменной, вы просто присваиваете классу B другое имя. Это эквивалентно делать

>>> class B(object): 
...  pass 
... 
>>> A = B 
>>> a = A() 
>>> b = B() 
0
не

«B» это просто строка, которая является именем A Одно место оно используется для по умолчанию __repr__ классов и их объектов

>>> A=type('B',(), {}) 
>>> A 
<class '__main__.B'> 
>>> a=A() 
>>> a 
<__main__.B object at 0xb7cf88ec> 

Обычный способ создать класс имеет возможности для явного задания атрибута __name__. В этом случае неявно устанавливается в конструктор класса

>>> class A:pass 
... 
>>> A 
<class __main__.A at 0xb7cf280c> 

Но ничто не мешает вам менять имя после

>>> A.__name__ 
'A' 
>>> A.__name__='B' 
>>> A 
<class __main__.B at 0xb7cf280c> 
>>> 
Смежные вопросы