python获取类名称_python - 获取实例的类名?

python - 获取实例的类名?

如果我从中执行此操作的函数是实例的类派生的基类,我如何找到在Python中创建对象实例的类的名称?

想到也许检查模块可能在这里帮助了我,但它似乎没有给我我想要的东西。 如果没有解析__class__成员,我不知道如何获取这些信息。

8个解决方案

1430 votes

您是否尝试过该类的__name__属性? 即type(x).__name__将为您提供该类的名称,我认为这是您想要的。

>>> import itertools

>>> x = itertools.count(0)

>>> type(x).__name__

'count'

此方法仅适用于新式类。 您的代码可能会使用一些旧式类。 以下适用于:

x.__class__.__name__

sykora answered 2019-01-13T11:54:15Z

300 votes

你想把类的名字作为字符串吗?

instance.__class__.__name__

truppo answered 2019-01-13T11:54:37Z

73 votes

type()?

>>> class A(object):

... def whoami(self):

... print type(self).__name__

...

>>>

>>> class B(A):

... pass

...

>>>

>>>

>>> o = B()

>>> o.whoami()

'B'

>>>

GHZ answered 2019-01-13T11:54:59Z

29 votes

class A:

pass

a = A()

str(a.__class__)

上面的示例代码(在交互式解释器中输入时)将生成'__main__.A'而不是'A',如果调用__name__属性,则生成'A'。 只需将A.__class__的结果传递给str构造函数,即可为您处理解析。 但是,如果您想要更明确的内容,也可以使用以下代码。

"{0}.{1}".format(a.__class__.__module__,a.__class__.__name__)

如果您在单独的模块中定义了具有相同名称的类,则此行为更可取。

上面提供的示例代码在Python 2.7.5中进行了测试。

Jonathan answered 2019-01-13T11:55:38Z

25 votes

type(instance).__name__ != instance.__class__.__name #if class A is defined like

class A():

...

type(instance) == instance.__class__ #if class A is defined like

class A(object):

...

例:

>>> class aclass(object):

... pass

...

>>> a = aclass()

>>> type(a)

>>> a.__class__

>>>

>>> type(a).__name__

'aclass'

>>>

>>> a.__class__.__name__

'aclass'

>>>

>>> class bclass():

... pass

...

>>> b = bclass()

>>>

>>> type(b)

>>> b.__class__

>>> type(b).__name__

'instance'

>>>

>>> b.__class__.__name__

'bclass'

>>>

Prasath answered 2019-01-13T11:55:56Z

13 votes

好问题。

这是一个基于GHZ的简单示例,它可以帮助某些人:

>>> class person(object):

def init(self,name):

self.name=name

def info(self)

print "My name is {0}, I am a {1}".format(self.name,self.__class__.__name__)

>>> bob = person(name='Robert')

>>> bob.info()

My name is Robert, I am a person

RyanN answered 2019-01-13T11:56:25Z

5 votes

或者你可以使用classmethod装饰:

class A:

@classmethod

def get_classname(cls):

return cls.__name__

def use_classname(self):

return self.get_classname()

用法:

>>> A.get_classname()

'A'

>>> a = A()

>>> a.get_classname()

'A'

>>> a.use_classname()

'A'

Yurii Rabeshko answered 2019-01-13T11:56:49Z

4 votes

除了获取特殊的__qualname__属性,您可能会发现自己需要给定类/函数的限定名称。 这是通过抓取类型__qualname__完成的。

在大多数情况下,这些都是完全相同的,但是,当处理嵌套类/方法时,它们的输出会有所不同。 例如:

class Spam:

def meth(self):

pass

class Bar:

pass

>>> s = Spam()

>>> type(s).__name__

'Spam'

>>> type(s).__qualname__

'Spam'

>>> type(s).Bar.__name__ # type not needed here

'Bar'

>>> type(s).Bar.__qualname__ # type not needed here

'Spam.Bar'

>>> type(s).meth.__name__

'meth'

>>> type(s).meth.__qualname__

'Spam.meth'

由于内省是你所追求的,所以你可能总是想要考虑。

Jim Fasarakis Hilliard answered 2019-01-13T11:57:26Z

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值