晚上花点时间研究了下库存的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认为子类和父类是同等的对象,
只是子类继承父类后,会保留父类的方法和成员,是否覆盖取决于他自己。