第12节- 面向对象二
第12节- 面向对象二
一、特殊方法:
在类中可以定义一些特殊方法,这些方法形如__xxx__()这种形式,特殊方法(魔术方法) 不需要我们自己去调用,会在特定时候自动调用
如上图:p1 = Person() 解释器默认会调用执行一次__init__()方法
p1.init() 再次调用__init__()方法
二、封装
(1)封装只是一个相对封装的效果,它是告诉你的协同开发者不要轻易修改里面的属性或方法**(只是业界约定俗成的规则)**
(2)封装是面向对象的三大特性之一
2.1 hidden+get+set方式进行声明封装
一般情况下,使用hidden_开头的属性都是私有属性,没有特殊情况下不要修改私有属性
如上图,仍然可以通过普通方式就行修改,但一般是在征得别人同意后约定通过get和set方法进行修改,如下图:
2.2 ‘__属性名’方式进行声明封装
(1)一般情况下,使用双下划线__开头的属性都是私有属性,没有特殊情况下不要修改私有属性
(2)“双下划线__”声明的封装相当于绝对封装,隐藏属性只能在类的内部访问,外部无法通过对象直接访问。外部需要通过“实例. _ Person_ _name”方法或者类中定义的“get/set”方法来进行修改(相当于进行了加密)
如上图:解释器决绝通过“_属性名”方式直接访问
如上图:“实例. _ Person _name”方法可正常访问,本程序中“__属性名”方式因为无法正常直接访问类内部属性,所以此处仅仅是又给p1重新定义了一个双下划线的属性
2.3 ‘_属性名’方式进行声明封装
(1)一般情况下,使用单下划线_开头的属性都是私有属性,没有特殊情况下不要修改私有属性
(2)单下划线+名称:平时常用的封装方法,类似hidden(get/set/_xxx都可修改),在业界声明为私有属性,不希望别人去修改它
2.4 封装小结
• 封装是指隐藏类对象中一些不希望被外部所访问到的属性或方法
• 在类对象内部可提供一个getter()和setter()方法使外部可以访问到属性(适用于任何一种封装方法)
• getter() 获取对象中指定的属性
• setter() 用来设置对象指定的属性
• 使用封装,增加了类的定义的复杂程度,但是它也确保了数据的相对安全
- 隐藏属性名,使调用这无法随意的修改对象中的属性
- 增加了getter()和setter()方法,很好控制属性是否是只读的
三、装饰器方法
1.无装饰器下的方法使用:
2、增加@property装饰器后:
需要去掉方法后面的(),使得方法的使用更加贴近封装之前的用法:
3、增加@property装饰器后,后面的方法已具备property属性
4、通过property中的setter属性,获得与非封装类似的属性变更方法(注意:不是传参方式了)
如上图:(1)使得name具备了property属性,(2)使用的是property属性的其中一个方法setter,因此要求(2)中带装饰器属性的name与(1)中被装饰器扩展的函数名name必须相同;但是(1)和(2)中的函数名可以不同