python之封装(面向对象三大特性之一)

__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.扩展性高

    使用者无需改变自己的使用方式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章