从方法中确定定义类

Posted

技术标签:

【中文标题】从方法中确定定义类【英文标题】:Determine the defining class from within a method 【发布时间】:2016-04-22 16:54:58 【问题描述】:

以下 Python 3.5 代码:

class Base(object):
    def __init__(self):
        print("My type is", type(self))

class Derived(Base):
    def __init__(self):
        super().__init__()
        print("My type is", type(self))

d = Derived()

打印:

My type is <class '__main__.Derived'>
My type is <class '__main__.Derived'>

我想知道,在每个__init__() 中,定义方法的类,而不是派生类。所以我会得到以下打印:

My type is <class '__main__.Base'>
My type is <class '__main__.Derived'>

【问题讨论】:

相关:***.com/questions/961048/…. @alecxe 我看到了那个链接,它与我的问题无关,因为 1) Base 和 Derived 都有 init 方法,因此中继名称没有帮助。 2) 我想知道 init 方法中的定义类,以及任何级别的继承。 【参考方案1】:

解决方案 1

使用super().__thisclass__:

class Base(object):
    def __init__(self):
        print("My type is", super().__thisclass__)

class Derived(Base):
    def __init__(self):
        super().__init__()
        print("My type is", super().__thisclass__)

d = Derived()

My type is <class '__main__.Base'>
My type is <class '__main__.Derived'>

解决方案 2

类工作没有那么优雅但硬接线:

class Base(object):
    def __init__(self):
        print("My type is", Base)

class Derived(Base):
    def __init__(self):
        super().__init__()
        print("My type is", Derived)

d = Derived()

输出:

My type is <class '__main__.Base'>
My type is <class '__main__.Derived'>

【讨论】:

确实 super().__thisclass__ (解决方案 1)可以解决问题。这正是我所需要的。

以上是关于从方法中确定定义类的主要内容,如果未能解决你的问题,请参考以下文章

如何确定方法是不是在 Smalltalk 中对象的祖先类中定义

JAVA模板方法设计模式(从现实生活角度理解代码原理)

如何以编程方式确定哪个类/模块定义了被调用的方法?

pymongo - 使用自定义游标类

java 设计模式之模板方法

模板方法模式