Python面向对象的三大特性(封装)
1、面向对象有哪些特性
三种:封装性、继承性、多态性
2、Python中的封装
在Python代码中,封装有两层含义:
① 把现实世界中的主体中的属性和方法书写到类的里面的操作即为封装
class Person()
# 封装属性
# 封装方法
②封装可以为属性和方法添加为私有权限
3、封装中的私有属性和私有方法
在面向对象代码中,我们可以把属性和方法分为两大类:公有(属性、方法)、私有(属性、方法)
公有属性和公有方法:无论在类的内部还是在类的外部我们都可以对属性和方法进行操作。
但是有些情况下,我们不希望在类的外部对类内部的属性和方法进行操作。我们就可以把这个属性或方法封装成私有形式。
4、稀有属性的访问限制
设置私有属性的方法非常简单:在属性名和方法前面加上两个下划线__即可。
示例:
class Person():
def __init__(self, name):
self.name = name
self.__age = 18
xiaoming = Person('小明')
print(xiaoming.name)
print(xiaoming.age) # AttributeError: 'Person' object has no attribute '__age'
# 报错,提示Person对象没有属性'__age'
类中的私有方法和私有属性,不能被子类继承。
当然,我们可以定义一个统计的访问“接口”(函数),专门用于实现私有属性的访问。
5、私有属性设置与访问“接口”
接口就是我们通常说的一个函数,这个函数可以实现对某些属性的访问(设置与获取)
外部可以通过特定的“接口”来实现对私有属性的方法。
在Python中,一般定义函数名’get_xx’用来获取私有属性,定义‘set_xx’用来修改私有属性值。
class Person():
def __init__(self, name):
self.name = name
self.__age = 18
def get_age(self):
# 内部访问:允许直接访问
# 外部访问:根据需求要添加限制条件
return self.__age
# 公共方法:提供给外部的设置接口
def set_age(self, age):
self.__age = age
xiaoming = Person('小明')
xiaoming.set_age(20)
print(xiaoming.get_age())
'''
20
'''
6、私有方法
私有方法的定义与私有属性基本一致,在方法名的前面添加两个下划线__方法名()
示例:
class Person():
def __init__(self, name):
self.name = name
self.age = 18
def __money(self):
print('我有800元的私房钱')
xiaoming = Person('小明')
xiaoming.__money() # AttributeError: 'Person' object has no attribute '__money'
# 报错,提示Person对象没有属性'__money'
7、封装性到底有何意义
①以面向对象的编程思想进行项目开发
②封装数据属性:明确的区分内外,控制外部对隐藏的属性的操作行为(过滤掉异常数据)
class Person():
def __init__(self, name, age):
self.__name = name
self.__age = age
def tell_info(self):
print('name:<%s>age:<%s>' % (self.__name, self.__age))
# 对私有属性的访问接口
def set_info(self, name, age):
if not isinstance(name, str):
print('名字必须是字符串类型')
return
if not isinstance(age, int):
print('年龄必须是数字类型')
return
self.__name = name
self.__age = age
xiaoming = Person('小明', 18)
xiaoming.tell_info()
xiaohua = Person('小华', 20)
xiaohua.tell_info()
xiaohong = Person('小红', 19)
xiaohong.tell_info()
'''
name:<小明>age:<18>
name:<小华>age:<20>
name:<小红>age:<19>
'''
③私有方法封装的意义:降低程序的复杂度
class ATM():
def __card(self):
print('插卡')
def __auth(self):
print('用户认证')
def __input(self):
print('输入取款金额')
def __print_bill(self):
print('打印账单')
def __take_money(self):
print('取款')
# 定义一个对外提供服务的公共方法
def withdraw(self):
self.__card()
self.__auth()
self.__input()
self.__print_bill()
self.__take_money()
atm = ATM()
atm.withdraw()
'''
插卡
用户认证
输入取款金额
打印账单
取款
'''