多态是指在运行时通过基类的指针或引用动态调用实际绑定对象的函数的行为。
对于其他如C++的语言,多态是通过在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。如果对象类型是派生类,就调用派生类的函数;如果对象类型是基类,就调用基类的函数。
class A
{
public:
virtual void show()
{
cout <<"A";
}
};
class B:public A
{
public:
void show()
{
cout << "B";
}
};
int main()
{
A*p = new B(); //父类指针指向子类对象
p->show();
}
而在python中,可以这么写:
class A:
def say(self):
print('A')
class B:
def say(self):
print('B')
def say(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;
typedef struct {
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的多态。
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ mac python3中如何解决中文乱码11/09
- ♥ 如何在 python 中卸载 selenium10/24
- ♥ python有什么优势09/25
- ♥ python三位逆序输出08/23
- ♥ 如何在 python 中的 ChainMap 中创建对象01/08
- ♥ python3.6.0如何安装11/22
内容反馈