python:__init__ 与 C++:构造函数

晚上花点时间研究了下库存的python代码底层,终于发现被坑的地方了,这里记一下。
python的面向对象方法和C++还是有一些不同。

class A():
    data = []
    def __init__(self, info=None):
        print 'start to print data in A'
        for i in self.data:
            print i
        print 'end print'

class B(A):
    data = [1, 2, 3]
    def __init__(self):
        print 'start to print data in B'
        self.data.append(4)
        for i in self.data:
            print i
        print 'end print'

B()
/*
output:
start to print data in B
1
2
3
4
end print
解释: B的成员和方法会彻底覆盖A父类的所有,不存在C++中的先调用父类初始化再调用子类初始化方法的现象。
常用方法:
在B的__init__函数中,调用A.__init__(self)来完成对父类初始化的调用,注意这里传入子类的self
*/

为了区分,顺便拿出C++版本的测试:

#include 

using namespace std;

class A {
    public:
    static int data;
    A(){
        cout << data << endl;
        cout << "print A data end" << endl;
    }
};

class B:A {
    public:
    int A::data = 66; // waring: c++ 11
    B(){
        A::data = 77; // succ
        cout << data << endl;
        cout << "print B data end" << endl;
    }
};
int A::data = 99; // must

int main()
{
    A a;
    B b;
    return 0;
}

/*
99
print A data end
99
print A data end
66
print B data end

C++与Python在处理对象的逻辑上有很大出入,例如: C++的父类成员一直存在,而且可以和子类分别调用,
而python中会尝试把同名变量融为一体。
即使是static变量,也不能实现子类在父类的构造函数前修改父类参数的实现。
*/

说的复杂了,简单的说,C++认为子类是父类生的,所以父类必须存在而且先存在;
python认为子类和父类是同等的对象,
只是子类继承父类后,会保留父类的方法和成员,是否覆盖取决于他自己。

此条目发表在C++, Python, 编程分类目录,贴了, , , 标签。将固定链接加入收藏夹。

发表评论

邮箱地址不会被公开。 必填项已用*标注