当你需要管理一个复杂的程序,里面有几十种不同的“事物”(比如用户、商品、订单),每种事物都有自己的数据和行为,你会如何组织代码,才能让它不至于变成一团乱麻,并且能轻松应对未来的功能变更?
① 封装性
将属性和方法书写到类的里面的操作即为封装,封装可以为属性和方法添加私有权限。
② 继承性
子类默认继承父类的所有属性和方法,与此同时子类也可以重写父类属性和方法。
③ 多态性
多态是同一类事物具有的多种形态。不同的对象调用同一个接口(方法),表现出不同的状态,称为多态。
在Python代码中,封装有两层含义:
① 把现实世界中的主体中的属性和方法书写到类的里面的操作即为封装
class Person(): # 封装属性 # 封装方法
在面向对象代码中,我们可以把属性和方法分为两大类:公有(属性、方法)、私有(属性、方法)
公有属性和公有方法:无论在类的内部还是在类的外部我们都可以对属性和方法进行操作。
但是有些情况下,我们不希望在类的外部对类内部的属性和方法进行操作。我们就可以把这个属性或方法封装成私有形式。
设置私有属性和私有方法的方式非常简单:在属性名和方法名 前面 加上两个下划线 __ 即可。
基本语法:
class Girl(): def __init__(self, name, age): self.name = name self.__age = 18xiaomei = Girl('小美')print(xiaomei.name)print(xiaomei.__age) # 报错,提示Girl对象没有__age属性
由以上代码运行可知,私有属性不能在类的外部被直接访问。但是出于种种原因,我们想在外部对私有属性进行访问,该如何操作呢?
答:我们可以定义一个统计的访问"接口"(函数),专门用于实现私有属性的访问。
在Python中,一般定义函数名get_xx用来获取私有属性,定义set_xx用来修改私有属性值。
class Girl(): def __init__(self, name): self.name = name self.__age = 18 # 公共方法:提供给外部的访问接口 def get_age(self): # 本人访问:允许直接访问 # 外人访问:加入限制条件 return self.__age # 公共方法:提供给外部的设置接口 def set_age(self, age): self.__age = agegirl = Girl('小美')girl.set_age(19)print(girl.get_age())
私有方法的定义方式与私有属性基本一致,在方法名的前面添加两个下划线__方法名()
① 以面向对象的编程思想进行项目开发
② 封装数据属性:明确的区分内外,控制外部对隐藏的属性的操作行为(过滤掉异常数据)
class People(): 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): ifnot isinstance(name, str): print('名字必须是字符串类型') return ifnot isinstance(age, int): print('年龄必须是数字类型') return self.__name = name self.__age = agep = People('jack', 38)p.tell_info()p.set_info('jennifer', 18)p.tell_info()p.set_info(123, 35)p.tell_info()
classATM: 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()
今日学习完毕,课后作业:
请编写一个 Student类,实现以下封装功能:
(1)私有属性:将学生的 __name(姓名)和 __score(成绩)设置为私有属性,防止在类外部被直接修改。
(2)公共接口:提供公共方法用于访问和修改这些属性:
① get_info(): 返回学生的信息字符串,格式为:"学生姓名:{name},成绩:{score}"。
② set_score(new_score): 设置学生成绩。在方法内进行数据验证,确保新成绩必须在 0到 100之间。如果成绩无效,则打印提示信息并不修改成绩。
(3)构造方法:使用 __init__方法初始化学生的姓名和成绩。