封装

封装

封装,顾名思义就是将内容封装到某个地方,以后再去调用被封装在某处的内容。
所以,在使用面向对象的封装特性时,需要:

  1. 将内容封装到某处
     class Person:
         Ethnicity = 'human'
         def __init__(self, name, age):
             self.name = name
             self.age = age
         def study(self, book):
             print('%s is studying %s' % (self.name, book))
     jack = Person('jack', 18)
    
    • 这里的Person类定义了name、age属性,study方法
    • 将Person实例化为jack,并将name、age属性,study方法封装进了jack
  2. 从某处调用被封装的内容
     print('%s is %s years.' % (jack.name, jack.age))
     jack.study('python')
    
    • jack对象看起来什么都没有定义,其实在Person类实例化为jack的时候就已经将定义好的属性和方法封装进jack对象了,所以直接就能使用
  3. 封装分两类
    • 数据封装,将数据封装到对象中
      • 上文中的Person类定义了name、age属性
    • 封装方法和属性,将一类操作封装到一个类中
      • 上文中的Person类定义了study方法,使得Person的对象都具有相同方法
      • 覆盖
  4. 封装之隐藏
    在方法,属性前加下划线进行隐藏,在类定义时,对下划线开头的属性进行变形_class_type,这样得到简单的数据隐藏

    这种变形的特点:
    1,在类外部无法直接obj._attrName
    2,在类内部是可以直接使用obj._AttrName
    3, 子类无法覆盖父类_开头的属性

    保护对象的属性:

    如果有一个对象,当需要对其进行修改属性时,有2种方法

    • 对象名.属性名 = 数据 ---->直接修改
    • 对象名.方法名() ---->间接修改

    为了更好的保存属性安全,即不能随意修改,一般的处理方式为

    • 将属性定义为私有属性
    • 添加一个可以调用的方法,供调用

    封装数据属性:明确的区分内外,

    property的使用
    将一些要通过计算才能得到的属性,伪造成数据属性
    在定义函数方法的前面加@property,方法加return返回值,使用者可以像使用属性方法那样调用函数方法,即不加括号就能得到数据
    定义多个相同方法的删改查操作操作
    @property
    @property.setter修改
    @property.deleter删除

原文地址:https://www.cnblogs.com/leiyiming/p/9194612.html