面向对象--封装

封装

1、私有成员(将成员藏起来)

(1)作用:无需向类外提供的成员,可以通过私有化进行屏蔽
(2)做法:命名使用双下划线开头
(3)本质:障眼法,实际也可以访问(对象名._类名__成员名)
(4)作用域:仅在本类中有效

class Wife():
    def __init__(self, name, age, weight):
        self.__name = name
        # 本质:障眼法(实际将变量名改为:_类名__age)
        # __weight == _Wife__weight
        self.__age = age
        self.__weight = weight


wife01 = Wife("zs", 19 ,190)
wife01.weight = 1900  #创建了新的变量,并不能够访问私有变量
print(wife01.__dict__)
wife01._Wife__age = 100 #修改了类中定义的私有变量
print(wife01.__dict__)

结果
如果想让外部类操作数据的话,可以由本类提供方法,进行设置数据和获取数据

class Wife():
    def __init__(self, name, age, weight):
        self.__name = name
        # 本质:障眼法(实际将变量名改为:_类名__age)
        # __weight == _Wife__weight
        self.__age = age
        self.__weight = weight

    def set_age(self, age):
        self.__age = age

    def get_age(self):
        return self.__age


w01 = Wife("zs", 19, 80)
w01.set_age(18)
print(w01.get_age())

结果
可以通过set和get方法对数据的进行判断和设置

class Wife():
    def __init__(self, name, age, weight):
        self.__name = name
        # 本质:障眼法(实际将变量名改为:_类名__age)
        # __weight == _Wife__weight
        self.__age = age
        self.__weight = weight

# 提供公开的读写方法
    def set_age(self, age):
        if age < 20 and age > 40:
            self.__age = age
        else:
            print("age 不符合")

    def get_age(self):
        return self.__age


w01 = Wife("zs", 19, 80)
w01.set_age(40)
print(w01.get_age())

结果
在构造方法中对私有变量进行了操作,所以构造方法对私有变量的操作也应该使用set和get方法

class Wife():
    def __init__(self, name, age):
        self.name = name
        # 本质:障眼法(实际将变量名改为:_类名__age)
        # __weight == _Wife__weight
        self.set_age(age)

# 提供公开的读写方法
    def set_age(self, age):
        if 20 > age > 40:
            self.__age = age
        else:
            print("age 不符合")

    def get_age(self):
        return self.__age


w01 = Wife("zs", 19)
w01.set_age(40)
print(w01.get_age())

但是这样写还是有弊端,因为set函数有可能是长度可变参函数,没办法看出来类有哪些成员,从而进行更改

2、property(读方法,写方法)对属性的读写进行拦截

class Wife(object):

    def __init__(self, age, name):
        self.age = age  # 通过变量间接调用set和get方法
        self.name = name

    def get_age(self):
        return self.__age

    def set_age(self, age):
        if 20 < age < 40:
            self.__age = age
        else:
            print("范围出错")

    age = property(get_age, set_age)


wife01 = Wife(29, "zs")
print(wife01.age)


结果
达到的效果,通过类变量指向property方法,实现对属性的拦截,直接用对象名.属性名就可以使用私有变量了,提供了方便


class Enemy:
    def __init__(self, name, hp, atk):
        self.name = name
        self.hp = hp
        self.atk = atk

    def get_atk(self):
        return self.__atk

    def set_atk(self, atk):
        if 10 <= atk <= 50:
            self.__atk = atk
        else:
            print("攻击力设置不可理")

    atk = property(get_atk, set_atk)

    def get_hp(self):
        return self.__hp

    def set_hp(self, hp):
        if 100 <= hp <= 200:
            self.__hp = hp
        else:
            print("血条设置不合理")

    hp = property(get_hp, set_hp)


e01 = Enemy("灭霸", 100)

内存图
set_hp 相当于是回调函数

 hp = property(None, set_hp)
 

将读方法置为空,表示不能进行读取
结果

3、常用写法

class Wife(object):
    def __init__(self, name, age, weight):
        self.name = name
        self.age = age
        self.weight = weight

    @property  # 创建property对象,只负责拦截读取操作
    def age(self):
        return self.__age

    @age.setter  # 只负责拦截写入操作
    def age(self, age):
        if 0 < age < 10:
            self.__age = age
        else:
            print("设置不合理")

    @property
    def weight(self):
        return  self.__weight

    @weight.setter
    def weight(self, value):
        self.__weight = value



原理和2的一模一样,只不过是写法更高级罢了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值