我正在使用python 2.7。
我有2个班级:
class Jambi(Model):
def do_something(self):
print # string of class that called `do_something`.
class User(Jambi):
def __init__(self):
pass
在do_something
对象的Jambi
方法中,我想知道哪个子类正在调用do_something
。因此,如果User
类的实例调用do_something
,则do_something
方法会打印出该类的字符串表示形式。
如何在do_something
内打印出此信息?
我一直在谷歌搜索,但我认为我有一些混淆的术语或其他东西,因为我没有在任何地方找到答案。
答案 0 :(得分:2)
如@ TadhgMcDonald-Jensen所述,您可以使用type(self)
。您也可以使用self.__class__
。前者更好,但是如果你的类不继承自object
(仅在Python 2中,因为在Python 3中,所有类都继承自object
),它就不起作用。如果要获取类的名称,请使用.__name__
。因此,它将是type(self).__name__
或self.__class__.__name__
。
>>> class MyClass:
... def __init__(self):
... print type(self), type(self).__name__
... print self.__class__, self.__class__.__name__
...
>>> MyClass()
<type 'instance'> instance
__main__.MyClass MyClass
>>> class MyClass2(MyClass):
... pass
...
>>> MyClass2()
<type 'instance'> instance
__main__.MyClass2 MyClass2
>>> class MyClass3(object):
... def __init__(self):
... print type(self), type(self).__name__
... print self.__class__, self.__class__.__name__
...
>>> MyClass3()
<class '__main__.MyClass3'> MyClass3
<class '__main__.MyClass3'> MyClass3
>>> class MyClass4(MyClass3):
... pass
...
>>> MyClass4()
<class '__main__.MyClass4'> MyClass4
<class '__main__.MyClass4'> MyClass4
答案 1 :(得分:1)
在实例上使用__class__.__name__
:
class Jambi():
def do_something(self):
print self.__class__.__name__
这将为您提供实例的类名称:
In [1]: class Jambi():
...: def do_something(self):
...: print self.__class__.__name__
...:
In [2]: class User(Jambi):
...: def __init__(self):
...: pass
...:
In [3]: u = User()
In [4]: u.do_something()
User
答案 2 :(得分:1)
self
表示调用该方法的实例,因此type(self)
或self.__class__
可以执行此操作。
答案 3 :(得分:1)
您可以使用print(type(self))
class Jambi(object):
def do_something(self):
print(type(self))
class User(Jambi):
def __init__(self):
pass
x = User()
x.do_something()
或(在python 3中)使用该类型的.__qualname__
来获取详细名称。在这两个版本中,您都可以使用__name__
来获取类名。