Python:更改类类型名称
你怎么把一个类的名字改成别的名字,而不是叫'classobj'呢?
class bob():
pass
foo = bob
print "%s" % type(foo).__name__
这样做会得到'classobj'。
2 个回答
12
class DifferentTypeName(type): pass
class bob:
__metaclass__ = DifferentTypeName
foo = bob
print "%s" % type(foo).__name__
这段代码会输出你需要的 DifferentTypeName
。不过,这样做可能并不是你真正想要的(或者需要的),但无论如何,它确实是按照你明确要求的方式来做的:也就是改变一个类的 type
的名字。之后,如果你把一个合适的新名字的 type
赋值给 foo.__class__
或者 bob.__class__
,也是可以的。所以你可以把这个过程封装成一个比较特别的函数:
def changeClassTypeName(theclass, thename):
theclass.__class__ = type(thename, (type,), {})
changeClassTypeName(bob, 'whatEver')
foo = bob
print "%s" % type(foo).__name__
这段代码会输出 whatEver
。
14
在你的例子中,你把 foo
定义成了指向 bob
类的定义,而不是指向 bob
的一个实例。其实,旧式类的类型确实是 classobj
。
不过,如果你创建了 bob
的实例,结果就会不一样了:
# example using new-style classes, which are recommended over old-style
class bob(object):
pass
foo = bob()
print type(foo).__name__
'bob'
如果你只是想查看 bob
类型的名字,而不想创建实例,可以使用:
print bob.__name__
'bob'
这样做是可行的,因为 bob
本身已经是一个类类型,所以它有一个 __name__
属性,你可以查询这个属性。