CPython解释器如何处理OOP

2024-06-23 18:31:13 发布

您现在位置:Python中文网/ 问答频道 /正文

一个朋友最近问“CPython解释器实际上是如何处理OOP(面向对象编程)的?”。你知道吗

这个问题最终让我困惑,因为我知道C不是面向对象的语言。你知道吗

我试着Googling it,搜索StackOverflow,甚至阅读CPython Wiki。但我找不到任何有用的东西。你知道吗

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def getInfo(self):
        return "Name: " + self.name + "\nAge: " + str(self.age)

# How the heck does CPython handle this?
personOne = Person("Bob", 34)
personTwo = Person("Rob", 26)

print( personOne.getInfo() )
print( personTwo.getInfo() )

所以现在我真的很想知道!如果CPython解释器本身不是面向对象的,那么它如何处理对象之类的事情呢?你知道吗


Tags: nameself语言agedef朋友面向对象cpython
2条回答

Python的OOP实现的全部复杂性远远超出了堆栈溢出答案的范围,但是可以提供一个概述。这会掩盖很多细节,比如元类、多重继承、描述符和C级API。不过,它应该让您了解为什么实现这样的事情是可能的,以及它是如何完成的一般印象。如果您想要完整的细节,您应该浏览CPython source code。你知道吗


Person类的实例这样的对象由以下内容组成:

  • 一个班级
  • 保留其属性的格言
  • 其他现在不相关的东西,比如__weakref__。你知道吗

一个类也很简单。是的

  • 基类
  • 保留其属性的格言
  • 其他现在不相关的东西,比如类名。你知道吗

当您使用class语句定义一个类时,Python会绑定一个指向您选择的基类的指针(如果您没有选择基类,则为object)和一个包含您定义的方法的dict,这就是您的新class对象。有点像下面的元组

Person = (object,
          {'__init__': <that __init__ method you wrote>,
           'getInfo': <that getInfo method you wrote>},
          those irrelevant bits we're glossing over)

但不是元组。(在C级,这个记录几乎是,但不完全是,作为一个结构实现的。)


在创建类的实例时,Python将指向类的指针和实例属性的新dict捆绑在一起,这就是您的实例。有点像下面的元组:

personOne = (Person, {}, those irrelevant bits we're glossing over)

不过,不是元组。同样,它几乎(但不完全)实现为C级的结构。你知道吗

然后它运行__init__,传递__init__新实例和您提供给类的任何其他参数:

Person.__init__(personOne, "Bob", 34)

属性赋值转换为对象dict中的设置项,因此__init__中的赋值:

def __init__(self, name, age):
    self.name = name
    self.age = age

使dict最终处于以下状态:

{'name': 'Bob', 'age': 34}

调用personOne.getInfo()时,Python会查找personOne的dict、类的dict、超类的dict等,直到找到'getInfo'键的条目。关联的值将是getInfo方法。如果在类dict中找到该方法,Python将插入personOne作为第一个参数。(它知道如何插入该参数的详细信息在descriptor protocol中)

这里有一个小的思维实验:你的CPU根本不是“面向对象的”。相反,它只能执行诸如“将寄存器1添加到寄存器2,并将结果放入寄存器3”和“如果寄存器5大于零,则执行这个goto语句”之类的指令,然而不知何故,CPU可以运行Python和其他面向对象语言。怎样?你知道吗

相关问题 更多 >

    热门问题