单下滑线
单下划线_xxx 开头:表示受保护的内部变量或函数,除非__all__=[‘内部变量1’,’内部变量2 ’] 中有,否则import时不会导入这些内部变量
双下滑线
类中双下划线__xxx 开头:表示私有属性或方法,__xxx 编译时会被改写_类名__xxx 即真正调用的方法名字已被改变,前加上了_类名
python
输出:
A.__name_private()
B.name_public()
分析: 先调用父类A构造方法》执行父类A构造方法中的私有方法(A的_A__name_Private() 方法)》调用子类B的name_Public() 方法(因为父类A的name_Public() 方法被子类B重写了)》调用子类B的构造方法》调用子类B的_B__name_Private() 方法》调用子类B的name_Public() 方法
代码:
class A(object):
def __init__(self):
self.__name_private()
self.name_public()
def __name_private(self):
print('A.__name_private()')
def name_public(self):
print('A.name_public()')
class B(A):
def __name_private(self):
print('B.__name_private()')
def name_public(self):
print('B.name_public()')
b = B()
类比Java
对比效果:
python | java |
---|
_xxx | protected | __xxx | private |
输出:
namePrivate A
namePublic B
namePrivate B
namePublic B
分析: 先调用父类构造方法》执行父类构造方法中的私有方法(A的namePrivate() 方法)》调用子类B的namePublic() 方法(因为父类A的namePublic() 方法被子类B重写了)》调用子类B的构造方法》调用子类B的namePrivate() 方法》调用子类B的namePublic() 方法
代码: A.java
public class A {
A() {
this.namePrivate();
this.namePublic();
}
private void namePrivate() {
System.out.println("namePrivate A");
}
public void namePublic() {
System.out.println("namePublic A");
}
}
B.java
public class B extends A {
B() {
this.namePrivate();
this.namePublic();
}
private void namePrivate() {
System.out.println("namePrivate B");
}
public void namePublic() {
System.out.println("namePublic B");
}
}
Main.java
public class Main {
public static void main(String[] args) {
B b = new B();
}
}
|