在 python 中调用超类的 __init__ 时显式传递 Self

2023-12-19

这个问题与帖子有关Python 中的“super”有什么作用? https://stackoverflow.com/questions/222877/how-to-use-super-in-python , 如何初始化基(超)类? https://stackoverflow.com/questions/3694371/how-do-i-initialize-the-base-super-class-in-python , and Python:如何从超类创建子类? https://stackoverflow.com/questions/1607612/python-how-do-i-make-a-subclass-from-a-superclass它描述了两种初始化方法SuperClass从一个内SubClass as

class SuperClass:
    def __init__(self):
        return
    def superMethod(self):
        return


## One version of Initiation
class SubClass(SuperClass):
    def __init__(self):
        SuperClass.__init__(self)
    def subMethod(self):
        return

or

class SuperClass:
    def __init__(self):
        return
    def superMethod(self):
        return

## Another version of Initiation
class SubClass(SuperClass):
    def __init__(self):
        super(SubClass, self).__init__()
    def subMethod(self):
        return

所以我有点困惑是否需要明确地 pass self作为参数SuperClass.__init__(self) and super(SubClass, self).__init__()。 (事实上​​,如果我打电话SuperClass.__init__()我收到错误

TypeError: __init__() missing 1 required positional argument: 'self'

)。但是当调用构造函数或任何其他类方法时(即:

## Calling class constructor / initiation
c = SuperClass()
k = SubClass()

## Calling class methods
c.superMethod()
k.superMethod()
k.subMethod()

), The self参数已传递隐含地 .

我的理解self关键字是它与thisC++ 中的指针,而它提供对类实例的引用。它是否正确?

如果总是有一个当前实例(在本例中SubClass),那么为什么self需要明确包含在调用中SuperClass.__init__(self)?

Thanks


这只是方法绑定,与super。当你可以的时候x.method(*args), Python 检查类型x对于名为method。如果找到一个,它就会将该函数“绑定”到x,这样当你调用它时,x将作为第一个参数在其余参数之前传递。

当您通过其类调用(普通)方法时,不会发生此类绑定。如果该方法期望其第一个参数是一个实例(例如self),需要你自己传入。

这种绑定行为的实际实现非常简洁。如果 Python 对象有一个描述符,那么它们就是“描述符”__get__方法(和/或__set__ or __delete__方法,但这些对于方法来说并不重要)。当你查找像这样的属性时a.b, Python 检查类a看看它是否有一个属性b这是一个描述符。如果是的话,它会翻译a.b into type(a).b.__get__(a, type(a)). If b是一个函数,它将有一个__get__实现我上面描述的绑定行为的方法。其他类型的描述符可以有不同的行为。例如,classmethod装饰器用特殊描述符替换方法,该描述符将函数绑定到类而不是实例。

蟒蛇的super创建特殊对象,其处理属性查找的方式与普通对象不同,但细节对于这个问题来说并不重要。通过调用的方法的绑定行为super就像我在第一段中描述的那样,所以self调用时自动传递给绑定方法。唯一特别的是super是它可能绑定一个不同的函数,而不是你在上面查找相同的方法名称self(这就是使用它的全部意义)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 python 中调用超类的 __init__ 时显式传递 Self 的相关文章

随机推荐

  • 在哪里初始化我的应用程序的基类 Swift

    我有一个名为Home这是我的应用程序的父类 现在 我想在某个地方初始化这个类 以便我可以从任何我想要的地方访问类中的所有内容 该应用程序的起点是RootViewController 我应该在起点初始化应用程序吗 如果是 我应该如何做才能从应
  • PyCharm:找不到 Anaconda 安装

    在使用 PyCharm 之前 我在 Windows 10 上将 Anaconda 安装在 C ProgramData Anaconda3 中 现在 当我尝试使用 conda env 时 PyCharm 显示 未找到 Anaconda 安装
  • 如何访问或翻译矢量绘图中的文本

    我有一个习惯view它显示一个drawable并检测触摸 它有多个drawable图层 其中一些包含文本 例如 我已将每个 SVG 矢量图形转换为vector drawable并希望能够将文本设置为资源 以便我可以替换不同的翻译 上面 He
  • 创建自托管 Web API 还是使用 Asp.Net Core Web API?

    我有两个选择 如果我使用自行托管 Web ApiOWIN Katana我可以获得性能提升 但如上所述here https forums asp net t 1908235 aspx Self hosting or IIS hosted 我必
  • Rails 按创建日期对记录进行分组

    所以我有一个模型 我想检索记录并按created at字段的日期对它们进行分组 但created at是一个日期时间字段 我只对日期部分感兴趣 所以我正在寻找类似二维数组的东西 第一层是一个以日期字符串为键的哈希 第二层是带有记录的数组 我
  • 我如何子类化 threading.Event?

    在 Python 2 7 5 中 from threading import Event class State Event def init self name super Event self init self name name d
  • Asp.Net MVC 4 中的自定义 URL 路由

    我怎样才能像这个网址一样 http www domain com friend content title http www domain com friendly content title 在 Asp Net MVC 4 中 注意 该参
  • 如何设置GAE环境特定的环境变量?

    我在 Go 中有一个 GAE 应用程序 使用martini https github com go martini martini 我需要能够设置MARTINI ENV环境变量告诉 martini 它应该使用生产设置进行初始化 根据Pyth
  • 仅包含 ASCII 字符的 UNICODE 字符串是否始终等于 ASCII 字符串?

    我注意到以下几点 gt gt gt u abc abc True gt gt gt abc u abc True 这总是正确的还是可能取决于系统区域设置 在 python 3 中字符串似乎是 unicode 例如这个问题 https sta
  • 如何删除 openlayer 中的特定标记

    这是来自 capdragon 更新的新代码 但现在它不会创建标记 我现在不知道如何解决这个问题 我认为代码片段是解决我之前识别标记问题的一种非常聪明的方法 而且它可能是我现在缺少的一个非常小的东西 任何再次帮助将不胜感激
  • 如何创建守护线程?

    java程序员可以手动创建守护线程吗 如何 java lang Thread setDaemon 布尔值 http java sun com javase 6 docs api java lang Thread html setDaemon
  • Boost.Python 和 Boost.Function

    我想包一个boost function类成员 以便可以按以下方式使用它 using namespace boost using namespace boost python struct gui button t function
  • 强制 C++ 函数的用户承认数值常量参数的语义的最佳方法是什么?

    我想编写函数接口来强制用户承认内置常量的语义 例如 我想采取 void rotate float angle Rotate the world by an angle in radians 并将其更改为 void rotate Radian
  • 允许函数指针类型的模板参数接受任何返回类型的函数

    当函数的返回值未被实际使用时 是否有一种方法允许函数指针类型的模板参数接受任何 而不是特定 返回类型的函数 这是一个 MCVE 来说明我的意思 int returnInt int return 0 void returnVoid int t
  • 恢复 scipy.optimize 中的优化?

    scipy optimize 提供了许多不同的方法用于多元系统的局部和全局优化 然而 我需要一个很长的优化运行 可能会被中断 在某些情况下 我可能想故意中断它 有什么办法可以重新启动吗 嗯 有什么办法吗 我的意思是 显然可以提供最后一组最优
  • 对于某些已保存的联系人,CallLog.Calls.CACHED_NAME 始终返回 null

    我试图在我的应用程序中显示通话记录详细信息 但 CallLog Calls CACHED NAME 对于某些联系人始终返回 null 即使它是已保存的带有姓名的联系人 内置通话记录正确显示这些联系人的姓名 这是我的代码 protected
  • jQuery.get() - 实际用途?

    我试图理解你为什么会使用jQuery get and jQuery get index http docs jquery com Core get 文档说它将 jQuery 选择转换为原始 DOM 对象 而不是将选择作为 jQuery 对象
  • 删除元组的智能方法

    我有一个元组列表 如下所述 该元组按第二个值的降序排序 from string import ascii letters myTup zip ascii letters range 10 1 threshold 5 5 gt gt gt m
  • Android:如何处理不准确的气压表?

    我一直在使用三星 Galaxy S3 开发一个应用程序 该应用程序使用气压计来估计用户的海拔高度 我使用 SensorManager getAltitude p0 p 并将 p0 设置为等于最近机场报告的海平面压力 我将 p 设置为等于气压
  • 在 python 中调用超类的 __init__ 时显式传递 Self

    这个问题与帖子有关Python 中的 super 有什么作用 https stackoverflow com questions 222877 how to use super in python 如何初始化基 超 类 https stac