我在实践中难以理解Python的继承,我有一个Base类和一个从Base类继承的Child类,并且我可以从Base类引用该子类的元素,并且不会引发任何错误。我可以看到传递给基类的引用类型是Inherited class类型,这也许就是为什么解析变量“ val”没有歧义的原因,但这是继承在所有其他语言中自然起作用的方式吗?
>>> class A(object):
... def test_method(self):
... print(type(self))
... print(self.val)
...
>>> class B(A):
... def __init__(self):
... self.val = 100
...
>>> b = B()
>>> dir(b)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__',
'__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__',
'__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__',
'__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__',
'__str__', '__subclasshook__', '__weakref__', 'test_method', 'val']
>>> b.test_method()
<class '__main__.B'>
100
在Java中也尝试过相同的方法,因此Java编译器很难找到在继承的类中定义的变量
class Parent {
int x;
public Parent(){
x = 100;
}
public void display(){
this.var = 1000;
System.out.println(this.var);
System.out.println(this.x);
}
}
public class AccessCheck extends Parent {
int var;
public AccessCheck() {
var = 2000;
}
}
以下是结果:
Error:(10, 13) java: cannot find symbol
symbol: variable var
Error:(11, 32) java: cannot find symbol
symbol: variable var
我希望结果的差异能够传达我想确切说的话。