`type`的第一个参数是做什么的?

时间:2009-12-08 07:31:46

标签: python metaprogramming

一些代码。

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在这里做的第一个参数是什么?

3 个答案:

答案 0 :(得分:2)

它正在设置已创建类的__name__属性。

当你说:

class B(object):

'B'会发生两件事:

  • 名称'B'被分配了类。这就像你说“B = ...”一样。

  • 该类的__name__属性设置为“B”。

手动调用类型构造函数时,只完成后半部分。如果你没有将结果分配给'B',那么B将保持原样(或未设置),如前所述。

请注意,可以通过以下方式获得类似的结果:

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

现在A指的是一个自称为'B'的类,B不指任何东西。

答案 1 :(得分: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'>

有关详细信息,请参阅type here的第二种形式。

当您将调用type的结果分配给变量时,您只是给类B另一个名称。这相当于做

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

答案 2 :(得分: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>
>>>