Bootstrap

【python面向对象】封装(面试题常考)

本章节的内容常常在面试题中出现,大家根据本文的思路可以很好的掌握。


封装浅层次

数据角度讲,将一些基本数据类型复合成一个自定义类型。

封装数据:
敌人(姓名,血量,攻击力,防御力)
二维向量(x,y)

优势:
1、更符合人类的思考方式。
2、将数据与对数据的操作整合在一起。

行为角度讲,向类外提供必要的功能,隐藏实现的细节。

封装行为:
二维列表助手类DoublelListHelper(获取多个元素get_elements
向量(向左╱向右,求模长,求方向等)

优势:以”模块化的方式进行编程,更可以集中精力设计、组织、指挥多个类协同工作。

一、使用方法,封装变量

#使用方法,封装变量
class   Wife:
    def __init__(self,name,age, weight):
        self.name = name
        # 本质:障眼法
        #实质:实际将变量名改为︰_类名__age
        # self.__age = age
        self.set_age(age)
        # self.__weight = weight
        self.set_weight(weight)

    # 提供公开的读写方法
    def get_age(self):
        return self.__age

    def set_age(self,value):
        if 21<= value <= 31:
            self.__age =value
        else:
            raise ValueError("我不要")

    # 提供公开的读写方法
    def get_weight(self):
        return self.__weight

    def set_weight(self,value):
        if 40<= value <= 80:
            self.__weight =value
        else:
            raise ValueError("我不要")
"""
#不建议下面的做法
w01 = Wife("铁锤公主",87,87)
#重新创建了新实例变量(没有改变类中定义的_age)
# w01.__age = 107
#修改了类中定义的私有变量
w01._Wife__age = 107
#__dict__:python内置变量,存储对象的实例变量
print(w01.__dict__)
"""
w01 = Wife("铁锤公主",30,57)
w01.set_age(25)
w01.set_weight(45)
print(w01.get_age())
print(w01.get_weight())
#25
#45

练习:
定义敌人类(姓名,攻击力10–50,血量100–200)
创建一个敌人对象,可以修改数据,读取数据。

class  Enemy:
    def __init__(self,name,attack,hp):
        self.name = name
        self.set_attack(attack)
        self.set_hp(hp)

    def set_attack(self,value):
        if  10 <=  value <= 50:
            self.__attack = value
        else:
            raise ValueError("不行")

    def get_attack(self):
        return self.__attack

    def set_hp(self,value):
        if 100 <= value <= 200:
            self.__hp = value
        else:
            raise ValueError("不行")

    def get_hp(self):
        return self.__hp

enemy = Enemy("灭霸",20,100)
enemy.set_attack(30)
print(enemy.get_attack(
;