封装演示01
'''
类的封装可有数据封装,方法封装,属性封装
'''
#数据的封装
class User:
def __init__(self,name,age):
self.name=name
self.age=age
#方法封装
class User:
def __init__(self,name,age):
self.name=name
self.age=age
def get_name(self):
return self.name
#只是方法的封装,通过定义方法,让对象调用方法得到数据
前面两种封装方法对于数据的安全保护不够强烈,应为对象可以直接通过objeect.name='like',之类的办法修改,获得类中的数据,外界对象可以直接获得类中的数据
属性的封装有两种
一种是规则的封装
通过在变量前加一个下划线,例如:self._name=name,这种封装和前面的数据封装是没有太大区别的,只是通过行业的规则进行限制
另一种是通过方法封装属性如下代码
class User:
def __init__(self,name,age):
self.__name=name
self.__age=age
def get_name(self):
return self.__name
def set_name(self,name):
self.__name=name
def get_age(self):
return self.__age
def set_age(self,age):
'''
可以再set_age中添加限制条件进行数据的限制
'''
self.__age=age
u=User('tom',60)
print(u.get_name(),u.get_age())
面向对象的封装:
- 数据封装
原始数据存在的问题
表示一个用户[账号、密码、性别、昵称]
username = "admin"
password = "123"
gender = "男
nickname = "小王"
四个变量互相没有关系~人为规定了 他们四个表示的是一个用户对象
这四个变量,随时可能被破坏他们的关系[username=True]
原始多个变量表示一个对象的方式:不稳定因素太大!
组合数据类型
表示一个用户,可以将多个数据存在一个组合数据类型变量中
user = {
"username": "admin",
"password": "123",
"gender": "男",
"nickname": "小王"
}
多个变量,被一个组合数据类型[字典]包装在一起
完成了多个数据之间的关联
他们依然不稳定!
user2 = {
"account": "admin",
"userpass": "123",
"sex": "男",
"nickname": "小王"
}
面向对象:
通过类型规范定义;通过对象包装数据
通过类型定义~一个数据中,需要包含那些数据[强制]
表示数据的时候~通过类型创建具体的对象,包装具体的数据
class User:
def __init__(self, username, password):
self.username=username
self.password=password
user1 = User("admin", "admin")
user2 = User("manager", "123123")
任何人创建的用户数据,格式和表示都是一模一样的!
这样的数据规范在面向对象中,是强制规定的!
软件开发-> 解决问题-> 处理数据-> 增删改查
数据如果不一致->软件不稳定
数据的一致性:软件开发的核心:面向对象提供了这样的数据基础!
面向对象:第一个封装:封装数据,将程序中需要的数据
按照统一的格式封装在类型的内部,通过该类型的对象
包装使用数据!
类型:声明数据格式
对象:包装使用数据
面向对象:第二个封装:封装行为[方法]
常规开发模式下,要处理一个功能,python一般都会定义成一个函数
要处理功能的函数:
(1) 和具体的某个功能有关系;获取当前系统时间
(2) 和具体的某个数据有关系;“用户”登录
原始操作模式[基础语法代码]--没有函数,功能靠每一行代码去直接执行
耦合度太高!复用性太差!性能操作太low!开发效率太低!
函数式编程[面向过程编程]--出现了封装可复用代码的函数
耦合度较低、复用性提升、性能操作提升,开发效率提高
函数太多,不利于管理!
界面函数、功能函数...
面向对象开发[函数和方法混合开发]
处理某个独立功能-> 封装成一个独立的函数
获取系统当前时间--封装成一个具体的功能函数
处理和某个数据关联的功能-> 功能代码封装成函数,讲函数封装在类型中[方法]
处理具体功能的方法,就和对应的数据强制关联,方便统一管理维护
models.py[数据模型模块]
class User:
def __init__(self, name, age, gender, birthday, create_time):
self.name = name
self.age = age
self.gender = gender
self.birthday = birthday
self.create_time = create_time
def show_info(self):
pass
def get_current_time():
# 获取当前系统时间,转换成字符串current_time
return current_time
u = User("小王", 18, "男", '2000-01-01', get_current_time())
面向对象:第三个封装[重点重点重点:封装属性]
属性是属于对象的特征,对象的特征是属于对象的数据
对象的数据~一般不让外界直接访问!
1. 面向对象中,数据存在的问题!数据安全性问题
对象属性可以直接被操作
走在大街上~,你的私人物品被特殊职业人拿走了!
解决方案:所有私人物品必须征得本人同意[行为]
对象的属性操作,必须通过方法操作
2. 通过方法限制属性的访问,提高属性的安全性
通过项目的规范,规定了一个下划线开头的属性
是属于对象的私有属性,不能在类型的外部调用!
这仅仅是一个规范,总有一些人~破坏这样的规范[新手,不知情]
规范行的东西,约束太差!导致项目开发效率较低!
3. 通过语法限制,让属性私有化,不让外界直接访问
python中规定了,两个下划线开头的属性是私有的
语法上外界不能直接访问
依然存在问题:但是已经不是问题!
作为一个有经验的开发人员,你要知道怎么操作私有属性
知道:知道规范怎么操作;知道破坏性的语法怎么操作!
总结封装:
在python中,封装按照如下步骤进行操作
(1) 定义类型,所有属性私有化[双下划线开头]
(2) 每个属性提供set/get方法[赋值/取值]
命名规范:赋值:set_属性名称(..)
取值:get_属性名称(..)
(3) 在get/set方法中,提供限制条件!