一、封装的概念
封装:指隐藏对象的属性和实现细节,不允许外部直接方位对象内部的信息,仅仅提供公共的访问方式给外部,实现外部对内部的操作和访问。
二、封装的目的和益处
封装的目的:
- 保护隐私数据和方法,明确内外区分。
- 隔离复杂的实现方法
例如:一个电视机,只提供几个按钮和一个遥控器给用户操作,并不需要知道电视机所有的内部信息和设计。
封装的益处:
- 便于使用
- 提高代码的复用性
- 隔离变化和复杂性
- 提高安全性
三、封装的方法
1、私有变量
python中采用双下划线开头的方式将变量设置为私有变量,即“__XXX”
私有变量的特点:
- “__XXX”这种私有变量只有类内部可以使用,例如self.__XXX,外部无法访问,即使使用__XXX这种形式。
- 子类无法覆盖父类定义的私有变量。
class P(object):
def __init__(self):
self.__A = 10
self.A = 0
def p(self):
print('%d ' % self.__A)
print('%d ' % self.A)
p = P()
p.p()
>>>
10
0
2、私有方法
没有定义私有方法时,子类会重写父类的方法:
class Animal(object):
def bak(self):
print('bak')
def test(self):
self.bak()
class Dog(Animal):
def bak(self):
print('汪汪')
d = Dog()
d.test()
>>>
汪汪
定义私有方法时,子类无法重写父类的方法:
class Animal(object):
def __bak(self):
print('bak')
def test(self):
self.__bak()
class Dog(Animal):
def __bak(self):
print('汪汪')
d = Dog()
d.test()
>>>
bak
四、property属性
1、property的概念和目的
- property属性:一种特殊的属性,可以将类中的方法变成同名的属性,可以用属性的方式来访问该方法。
- property属性特点:
- 定义时,在方法前添加@property装饰器,且仅有一个self参数。
- 调用该方法时,用属性方式调用,不需要加括号。
- 使用property属性的目的:使用property属性之后,调用方法时,直接得到该结果,无法知悉方法本身细节。
2、property两种使用方式
-
property装饰器方式
在类的实例方法之前添加@property装饰器。
在python3 中,该装饰器有三种形式, -
@property 相当于调用函数,类似于“读”
-
@xxx.setter 相当于可以输入参数的调用参数,类似于“写”
-
@xxx.deleter 相当于调用函数可以进行删除操作等,类似于“删”
class Person(object):
def __init__(self, name):
self.__name = name
# python3 中才有property的@xxx.setter,@xxx.deleter形式
@property # 读
def name(self):
print(self.__name)
@name.setter # 写
def name(self, name1):
self.__name = name1
print(self.__name)
@name.deleter # 删除
def name(self):
print(None)
p = Person('Tom')
p.name
p.name = 'Jack'
del p.name
>>>
Tom
Jack
None
- property类属性方式
property()函数有四个参数:
property(get_XXX, set_XXX, del_XXX, “doc_description”)
- 第一个,方法名, 调用方法:对象.属性
- 第二个,方法名, 调用方法:对象.属性 = xxx
- 第三个,方法名, 调用方法:del 对象.属性
- 第四个,字符串, 调用方法:对象.属性.doc ,属性的描述
class Person(object):
def __init__(self, name):
self.__name = name
def name(self):
print(self.__name)
def set_name(self,name1):
self.__name = name1
print(self.__name)
def del_name(self):
print(None)
NAME = property(name, set_name, del_name)
p = Person('Tom')
p.NAME
p.NAME = 'Jack'
del p.NAME
>>>
Tom
Jack
None