python(十六)访问保护机制

先从java中说起

首先 B 继承自 A,那么 A 中的所有东西,B 都会继承到。但B能不能访问,就是另一回事了。
有点拗口,看图和例子
在这里插入图片描述
第一条指的是:继承是全部继承了,但能不能用是另一回事
第二条指的是:没看懂
(protected,指在:如B继承了A,则B中可以访问到A的protected,但B的对象b,则访问不到)

例子
先看目录结构
在这里插入图片描述

ABC
父类子类用来测试的

A:

package day5;

public class A {
	protected int a = 1;
	private int b = 2;
	int c = 3;

	public void say() {
		System.out.println(b);
	}

}

B:

package day5;

public class B extends A {
	public void doo() {
		System.out.println("B");
	}
}

C1:

package day5;

public class C1 {
	public static void main(String[] args) {
		A a = new A();
		A a1 = new B();
		B b = new B();
		System.out.println(a.a); // protected
		System.out.println(a.c); // default
		a1.say(); // public 证明 B 是把所有东西都继承了
		System.out.println(b.a); // protected
		System.out.println(b.c); // default
	}
}

C2:与A、B不在同一个包中

package day6;

import day5.A;
import day5.B;

public class C2 {
	public static void main(String[] args) {
		A a = new A();
		A a1 = new B();
		B b = new B();

	}

}
  • 只能访问 A 中public
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    另外,如何通过反射得到B的父类的成员
import java.lang.reflect.Field;

import t2.A;
import t2.B;
public class C2 {
	public static void main(String[] args) {
		// 这样得不到
		Class clazz = B.class;
		for (Field field : clazz.getDeclaredFields()) {
			System.out.println(field.getName());
		}
		System.out.println("--------------------");
		// 使用B.class.getSuperclass();
		Class clazz2 = B.class.getSuperclass();
		for (Field field : clazz2.getDeclaredFields()) {
			System.out.println(field.getName());
		}
	}

}

再来说说python的

Python并没有对私有成员提供严格的访问保护机制。

私有公有
以两个或多个下划线开头‘__’,并不以两个或多个下划线结束
在类外不能被直接访问,需要以 object._classname__varname 的形式来访问,或者像 Java中的get、set方法一样访问可直接访问
class Demo:
    def __init__(self, t1, t2, t3):
        self.t1 = t1 # 公有实例变量
        self._t2 = t2 # 公有实例变量
        self.__t3 = t3 # 私有实例变量


d = Demo('a', 'b', 'c')
print(d.t1)
print(d._t2)
print(d._Demo__t3)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值