__x = 1 # _A__x
什么是封装
变量名称前加上__ 就是隐藏变量。
隐藏类型的原理是 在定义的时候把隐藏名称变名 __AttrName --------> _classname__AttrName
class Foo:
def __func(self):
print('from foo')
class Bar(Foo):
def __func(self):
print("from Bat")
b = Bar()
b._Bar__func()
... 特点: 1、外部无法直接obj.__AttrName 2、在类内部__AttrName是可以直接调用的 3、子类无法覆盖父类__AttrName 的属性(名字都不一样啦,加了类名) ...
这种隐藏只是变性操作,把所有下划线变成别的名称。在类定义阶段就实现。
例子一:
class A:
def foo(self):
print('A.foo')
def bar(self):
print('A.bar')
self.foo()
class B(A):
def foo(self):
print("B.foo")
b =B()
b.bar()
b没有bar(),查到class A执行,但是调用foo的时候其实是调用的class B的函数。为了在bar()绝对使用class A的foo函数, 因 此要用到封装。
封装的意义
1.封装数据属性:明确区分内外,控制外部对隐藏属性的操作
在外部无法直接接触到隐藏的属性,可以在class内部写一个接口提供窗口。但是这样就规定了__name的格式。
class People:
def __init__(self,name,age):
self.__name = name
self.__age = age
def tell_info(self):
print('Name:<%s> Age:<%s>'%(self.__name,self.__age))
p = People('egon',18)
p.tell_info()
相同的道理,可以在class内部写一个接口修改隐藏属性的数据。并且可以对输入的数据进行验证功能。
def set_info(self,name,age):
if not isinstance(name,str):
return
self.__name = name
self.__age = age
2.封装方法目的:隔离复杂度
将复杂的方法封装在内部。
3.扩展性高
使用者无需改变自己的使用方式。