目录
一、封装介绍
1、封装介绍
1)封装就是把抽象出的数据[属性]和对数据的操作[方法]封装在一起,数据被保护在内部
2)程序只有通过被授权的操作,才能对数据进行访问
2、封装经典案例
电视机的操作就是典型封装
二、封装的理解和好处
1、隐藏实现细节:方法(绘制柱状图)<--调用(传入参数...)
2、可以对数据进行验证(比如age:1~20,password长度要求等),保证安全合理
3、可以保护数据隐私(比如 salary),要求授权才可以访问
三、私有成员
1、公共的变量和方法
1)默认情况下,类中的变量和方法都是公有的,它们的名称前都没有下划线
2)公共的变量和方法,在类的外部、类的内部,都可以正常访问
class Person:
name="tim"
age=18
def hi(self):
print(f"hi {self.name}")
def ok(self):
print("ok..")
self.hi()
p1=Person()
print(f"p1 name:{p1.name}")
p1.hi()
p1.ok()
2、如何将属性/方法进行私有化
类中的变量或方法以双下划线__开头命名,则该变量或方法为私有的,私有的变量或方法,只能在本类内部使用,类的外部无法使用
3、如何访问私有属性/方法
提供公共的方法,用于对私有成员进行操作
四、快速入门
1、快速入门
创建职员类(Clerk),属性有name,job,salary
1)不能随便查看职员Clerk的职位和工资等隐私,比如职员("tiger","python工程师",20000)
2)提供公共方法,可以对职位和工资进行操作
2、代码实现
class Clerk:
# 公共属性
name=None
# 私有属性
__job=None
__salary=None
# 构造方法
def __init__(self,name,job,salary):
self.name=name
self.__job=job
self.__salary=salary
# 提供公共的方法,对私有属性操作(根据实际的业务编写即可)
def set_job(self,job):
self.__job=job
def get_job(self):
return self.__job
# 私有方法
def __hi(self):
print("hi()")
# 提供公共方法,操作私有方法
def f1(self):
self.__hi()
clerk=Clerk("tiger","python工程师",20000)
# 如果是公共属性,在类的外部可以直接访问
print(clerk.name)
# 如果是私有属性,在类的外部不可以直接访问
# print(clerk.__job) # 报错
# 通过公共方法,访问/操作私有属性
print(clerk.get_job())
clerk.set_job("java工程师")
print(clerk.get_job())
# 私有方法不能在类的外部直接调用
# clerk.__hi() # 报错
# 通过公共方法,调用私有方法
clerk.f1()
五、注意事项和使用细节
Python语言的动态特性,会出现伪私有属性的情况
class Clerk:
# 公共属性
name=None
# 私有属性
__job=None
__salary=None
# 构造方法
def __init__(self,name,job,salary):
self.name=name
self.__job=job
self.__salary=salary
def get_job(self):
return self.__job
# 创建对象
clerk=Clerk("tiger","python工程师",20000)
# 因为 Python语言的动态特性,会动态创建属性__job
# 但是这个属性和我们在类中定义的私有属性__job并不是同一个变量
# 我们在类中定义的__job私有属性完整的名字是_Clerk__job
clerk.__job="Go工程师"
print(f"job={clerk.__job}") # job=Go工程师
# 获取真正的私有属性__job
print(f"{clerk.get_job()}") # python工程师
六、练习题
定义Account类
1)Account类要求具有属性:姓名(长度为2-4位)、余额(必须>20)、密码(必须是6位),如果不满足,则给出提示信息,并给默认值
2)通过set_xxx的方法给Account类的属性赋值
3)编写方法query_info()接收姓名和密码,如果姓名和密码正确,返回该账号信息
class Account:
__name=None
__balance=None
__pwd=None
def set_name(self,name):
# 姓名(长度为2-4位)
if 2<=len(name)<=4:
self.__name=name
else:
print("名字的长度不在2-4位")
def set_balance(self,balance):
# 余额(必须>20)
if balance>20:
self.__balance=balance
else:
print("余额(必须>20)")
def set_pwd(self,pwd):
# 密码(必须是6位)
if len(pwd)==6:
self.__pwd=pwd
else:
print("密码(必须是6位)")
def query_info(self,name,pwd):
if name==self.__name and pwd==self.__pwd:
return f"账号信息 {self.__name} {self.__balance}"
else:
return "请输入正确的名字和密码"
# 测试
account=Account()
account.set_name("jack")
account.set_pwd("123456")
account.set_balance(100)
print(account.query_info("jack","123456"))