Python:更改类类型名称

0 投票
2 回答
11418 浏览
提问于 2025-04-15 16:42

你怎么把一个类的名字改成别的名字,而不是叫'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__ 属性,你可以查询这个属性。

撰写回答