概述
类的封装
封装可以把属性或方法隐藏起来,以起到对保护数据的作用。但封装的作用不仅仅是把数据隐藏起来。
python的三种封装方式
1、pulbic: 公共的,其实就是不封装,是对外开放的
2、protected:受保护的,在属性或方法前加一个下划线,如:_name 被这种方式封装的成员不对外开放,只能在类内部或
子类中直接访问,(约定俗成)如果你非要用实例对象引访问受保护的属性也是可以的,只不过显得有点傻,而且不会有代码补全
(实验平台PyCharm)
3、private: 私有的,在属性或方法前加两个下划线,如:__name 被这种方式封装的成员对谁都不公开,只能在定义它的类中
访问。私有属性不会被继承
PS:python中的私有成员并不是真正意义上的私有,而是在类的定义阶段对成员进行了变形操作(就是给它改了个名字)。类中所有以双下划线开头的成员(如:__name)都会在类定义时自动变形成:_类名__name 的形式。所以,我们仍可以在外部通过_类名__name的形式对私有成员进行访问。
# 例如下
class A:
name = '阿珍'
# public属性
_age = 18
# protected属性
__boyfriend = '阿强'
# private属性
def privacy(self):
print(self.__boyfriend)
# 类中直接访问私有属性,此处解释器会自动将__boyfriend改成_A__boyfriend
class B(A):
def printf_pro(self):
print('A的受保护的属性', self._age)
@staticmethod
def printf_pri():
print('A的私有属性', B.__boyfriend)
# 欲在子类中访问父类的私有属性
sample = A()
sample2 = B()
print(A.__dict__)
# {'name': '阿珍', '_age': 18, '_A__boyfriend': '阿强', 'privacy': <function A.privacy at 0x00000196D30BCAF8>, }
# 可见私有属性__boyfriend已经被变形了。对于实例对象sample和子类B来说类A没有这个属性,所以把属性或方法定义成私有的可以有效防止对象和子类对该方属性或方法的覆盖
# print(sample.__boyfriend)
# 'A' object has no attribute '__boyfriend'
# 欲用对象访问私有属性
# sample2.printf_pri()
# # 欲在子类中访问父类的私有属性
# # type object 'B' has no attribute '_B__boyfriend' (可见私有属性不会被继承)
print(sample._A__boyfriend)
# 阿强
# 用对象访问私有属性,可以,但没必要
sample.privacy()
# 阿强
# 在类中直接访问私有属性,可以
print(sample._age)
# 18
# 用对象访问受保护的属性。可以,但没必要
sample2.printf_pro()
# A的受保护的属性 18
#在子类中直接访问父类受保护的属性 可以,没啥问题
封装的目的
封装的真谛在于明确的区分内外,封装过的成员可以直接在内部使用,而不能直接在外部使用;不过定义成员的目的就是要拿来用的,所以外部要想使用类隐藏的成员,就需要我们为其提供接口,让外部能够间接的使用我们隐藏起来的成员。这样做是有很大的意义的:
1、封装数据
对数据的封装的目的不仅仅是把数据隐藏保护起来,而是隐藏之后对外提供操作该数据的接口,然后我们可以在接口附加上对该
数据操作的限制,以此完成对数据属性操作的严格控制
例如下:
class MyTest:
def __init__(self, name: str, age: int):
self.set_info(name, age)
# 对数据的初始化进行某种格式限制
def print_info(self):
print(self._name, self._age)
def set_info(self, name: str, age: int ):
if not isinstance(name, str):
print('Erorr: name is not str')
if not isinstance(age, int):
print('Erorr: age is not int')
self.__name = name
self.__age = age
sample = MyTest('阿珍', 18)
sample.print_info()
2、封装方法
封装方法的目的是隔离复杂度,对于用户,他不需要知道一个方法具体是怎么执行实现的只需要知道它的功能就可以了。
例如下:
class ATM:
def __incard(self):
print('插卡')
def __auth(self):
print('输入并验证密码')
def __input(self):
print('输入取款金额')
def __print_bill(self):
print('打印账单')
def __take_money(self):
print('取款')
def withdraw_money(self):
self.__incard()
self.__auth()
self.__input()
self.__print_bill()
self.__take_money()
sample = ATM()
sample.withdraw_money()
PS:python并不会真的阻止你访问私有的属性,模块也遵循这种约定,如果模块名以单下划线开头,那么from module import *
时不能被导入,但是你from module import _private_module
依然是可以导入的。python要想严格控制属性的访问权限,只能借助内置方法如__getattr__等。
最后
以上就是寒冷草丛为你收集整理的Python学习笔记 封装类的封装封装的目的的全部内容,希望文章能够帮你解决Python学习笔记 封装类的封装封装的目的所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复