封装
封装
封装,顾名思义就是将内容封装到某个地方,以后再去调用被封装在某处的内容。
所以,在使用面向对象的封装特性时,需要:
- 将内容封装到某处
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
- 从某处调用被封装的内容
print('%s is %s years.' % (jack.name, jack.age)) jack.study('python')
- jack对象看起来什么都没有定义,其实在Person类实例化为jack的时候就已经将定义好的属性和方法封装进jack对象了,所以直接就能使用
- 封装分两类
- 数据封装,将数据封装到对象中
- 上文中的Person类定义了name、age属性
- 封装方法和属性,将一类操作封装到一个类中
- 上文中的Person类定义了study方法,使得Person的对象都具有相同方法
- 覆盖
- 数据封装,将数据封装到对象中
-
封装之隐藏
在方法,属性前加下划线进行隐藏,在类定义时,对下划线开头的属性进行变形_class_type,这样得到简单的数据隐藏
这种变形的特点:
1,在类外部无法直接obj._attrName
2,在类内部是可以直接使用obj._AttrName
3, 子类无法覆盖父类_开头的属性保护对象的属性:
如果有一个对象,当需要对其进行修改属性时,有2种方法
- 对象名.属性名 = 数据 ---->直接修改
- 对象名.方法名() ---->间接修改
为了更好的保存属性安全,即不能随意修改,一般的处理方式为
- 将属性定义为私有属性
- 添加一个可以调用的方法,供调用
封装数据属性:明确的区分内外,
property的使用
将一些要通过计算才能得到的属性,伪造成数据属性
在定义函数方法的前面加@property,方法加return返回值,使用者可以像使用属性方法那样调用函数方法,即不加括号就能得到数据
定义多个相同方法的删改查操作操作
@property
@property.setter修改
@property.deleter删除