寻找一种方法来让类方法知道哪个子类称为

时间:2016-04-11 23:04:53

标签: python python-2.7 inheritance

我正在使用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内打印出此信息?

我一直在谷歌搜索,但我认为我有一些混淆的术语或其他东西,因为我没有在任何地方找到答案。

4 个答案:

答案 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__来获取类名。