在看到网上好多介绍子类不能继承父类的私有属性和方法后,抱着怀疑的态度进行了测试后,发现子类是可以继承父类的私有属性和方法,但是在实际进行开发过程中,不建议这么用
# 单继承:当前类只有一个父类
# 单继承第一个特点:子类可以拥有父类的所有属性和方法
# 什么时候用继承?
# 如果该类的属性和方法用得到,但是不够完善
# 则可以通过继承给该类扩展属性和功能
class A(object):
name = "张三"
_age = 0
__address = "河南郑州"
def hello(self):
pass
def _eat(self):
pass
def __sleep(self):
pass
class B(A):
pass
# 类外访问属性
# 1)常规属性对象可以直接打点使用
# 2)单下划线属性,打点调用不提示,但是可以正常使用
# 3)双下划线属性,打点调用不提示,且不能强制使用
# 可以通过 对象._类名__属性
# 类外访问方法
# 1)常规方法对象可以直接打点使用
# 2)单下划线方法,打点调用不提示,但是可以正常使用
# 3)双下划线方法,打点调用不提示,且不能强制使用
# 可以通过 对象._类名__方法
# 子类重写父类属性
# 1)常规属性会直接覆盖
# 2)单下划线属性会直接覆盖
# 3)双下划线属性不能覆盖
# 子类重写父类方法
# 1)常规方法会直接覆盖
# 2)单下划线方法会直接覆盖
# 3)双下划线方法不能覆盖
# 总结:双下划线属性和方法表示为私有(要求只能在类内使用,类外不能用)
# 但是,python限制没那么严格,可以通过上面访问属性和方法第3步这种方式强制使用(不推荐)
a = A()
print(a.name, a._age, a._A__address)
# 子类能够使用父类的哪些属性?
# 1.常规属性
# 2.单下划线属性 子类对象._属性
# 3.双下划线属性 子类对象._父类__属性名
# 子类能够使用父类的哪些方法?
# 1.常规方法
# 2.单下划线方法 子类对象._方法
# 3.双下划线方法 子类对象._父类__方法
b = B()
print(b.name, b._age, b._A__address)
# 如果子类访问一个自己没有的属性和方法,会怎么样?
# 1)先在本类中查找是否拥有该属性和方法
# 2)如果没有,查找父类中是否拥有该属性/方法
# 3)如果没有,继续向上查找
# 4)如果最后还是没有,则报错
print(b.phone)
# python明确规定,_和__属性和方法,类外理论上可以用,实际上做项目时代码中最好不要用
|