面向对象编程-封装

目录

一、封装介绍

1、封装介绍

2、封装经典案例

二、封装的理解和好处

三、私有成员

1、公共的变量和方法

2、如何将属性/方法进行私有化

3、如何访问私有属性/方法

四、快速入门

1、快速入门

2、代码实现

五、注意事项和使用细节

六、练习题


一、封装介绍

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"))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值