最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • python如何实现多态

    正文概述    2020-04-29   287

    python如何实现多态

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

    对于其他如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平台》

    而在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文件的顶部注释:

    python如何实现多态

    在第一句里面写着,对象总是通过指针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的多态。


    起源地下载网 » python如何实现多态

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元