python如何使用多态_探索Python的多态是怎么实现的

多态是指通过基类的指针或者引用,在运行时动态调用实际绑定对象函数的行为。

对于其他如C++的语言,多态是通过在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。如果对象类型是派生类,就调用派生类的函数;如果对象类型是基类,就调用基类的函数。

classA

{public:virtual voidshow()

{

cout<

}

};class B:publicA

{public:voidshow()

{

cout<< "B";

}

};intmain()

{

A*p = new B(); //父类指针指向子类对象

p->show();

}

而在python中,可以这么写

classA:defsay(self):print('A')classB:defsay(self):print('B')defsay(obj):

obj.say()

a=A()

say(a)

那么,它内部是怎么实现的呢?

首先,我们先看一下Python源码中的object.h文件的顶部注释

在第一句里面写着,对象总是通过指针PyObject *来访问。那么什么是PyObject呢。

在Python中,所有的东西都是对象,而PyObject里面是所有对象中所拥有的相同的内容。

我们来看两个结构体:

typedef struct_object {

_PyObject_HEAD_EXTRA

Py_ssize_t ob_refcnt;struct _typeobject *ob_type;

} PyObject;

typedefstruct{

PyObject ob_base;

Py_ssize_t ob_size;/*Number of items in variable part*/} PyVarObject;

第一个就是PyObject,而第二个,我们根据名字就可以知道这是可变的对象的结构体,包含了一个PyObject和一个所容纳元素的个数部分。

当我们创建一个对象时,分配内存进行初始化,这时候会用一个PyObject类型的指针变量来指向这块内存进行保存和维护。

就像我们声明一个整数,得到整数对象,用于指向这块内存地址的,不是PyIntObject *,而是PyObject *。

其实类型本身也是一种对象,PyTypeObject。当我们实例化一个整数对象的时候。PyIntObject的ob_type指针指向PyInt_Type,而PyInt_Type的ob_type又指向PyType_Type。而PyInt_Type和PyType_Type其实都是PyTypeObject的示例。

所以,我们在传递对象的时候,传递的是PyObject *指针这种泛型指针,我们只能通过ob_type进行判断对象类型,通过传递泛型指针的方式,实现了Python的多态。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值