【问题标题】:Python Class with Class input带有类输入的 Python 类
【发布时间】:2020-03-05 21:19:01
【问题描述】:

我正在研究一个包的源代码,并注意到类能够调用类中未定义的某些方法。

例如:

inst = ClassA()
meth = inst.meth1()
"some stuff printing to console"

但是,meth1() 未在 ClassA 中定义。在 ClassA 定义中,有一个输入引用了另一个类:

from package.sub.file import ClassB
class ClassA(ClassB):
    ...normal class stuff...

来自另一个文件:

class ClassB:
   ...normal class stuff...
    def meth1(self):
        ...stuff...

我的主要问题是这怎么可能? meth1 如何成为ClassA 的方法?我很困惑为什么将ClassB 作为输入传递会将与ClassB 关联的所有方法转移到ClassA

【问题讨论】:

标签: python python-3.x


【解决方案1】:

这是继承,是面向对象编程中的一个常见概念。

当一个类(子类)从另一个类(父类)继承时,子类的实例被视为与父类的实例完全相同。这意味着如果父级定义了一个方法,那么它的子级实例也可以使用它。


至于Python如何实现继承,系好安全带:)

在创建ClassA 时,它会添加一个称为方法解析顺序 (MRO) 的属性。

>>> ClassA.__mro__
(<class '__main__.ClassA'>, <class '__main__.ClassB'>, <class 'object'>)

这是使用ClassA、它的父类和他们的父类构建的,一直到object,最终的基类;它用于各种属性查找。

略略的叙述:

当您尝试调用 inst.meth1 时,Python 会执行以下步骤(为了清晰和简洁,省略了一些步骤):

  1. inst.meth1 存在吗?不。开始检查 MRO 中的课程
  2. ClassA.meth1 存在吗?不,请检查下一堂课。
  3. ClassB.meth1 存在吗?是的。
  4. 什么是ClassB.meth1?这是一个函数;使用inst 作为第一个参数调用它。

因此(不详述描述符协议),inst.meth1() 等价于ClassB.meth1(inst)

【讨论】:

    猜你喜欢
    • 2020-12-17
    • 2020-11-23
    • 2022-10-02
    • 2019-05-13
    • 1970-01-01
    • 2022-08-21
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    相关资源
    最近更新 更多