私有属性的意义
''' 封装数据属性: 明确的区分内外 保护数据 '''# 1. 定义一个Girl类classGirl(object):# 定义公有属性 和 私有属性def__init__(self,name):self.name=name self.__age=18# 如果一个类中存在私有属性 一定有 set 和 get方法defset_age(self,age):# 区分内外 过滤掉 外部的异常属性 起到保护数据的作用ifnotisinstance(age,int):print('很抱歉 你的输入有误! 请输入数字类型!')if18<=age<=100:self.__age=ageelse:print('很抱歉 你的年龄不符合要求 ')returndefget_age(self):# 额外添加权限的验证功能# 如果有权限 才可以访问# 反之拒绝用户访问returnself.__age# 实例化对象g1=Girl('小妹')# 设置私有属性值g1.set_age(25)# 获取私有属性print(g1.name)print(g1.get_age())
私有方法的意义
''' 私有方法主要用于降低程序的复杂度 '''# 没有私有方法classATM(object):defcard(self):print('插卡')defauth(self):print('验证权限')definput_money(self):print('输入取款金额')defbill(self):print('账单')deftake_money(self):print('取款')# 实例化类 创建对象atm=ATM()# 取款atm.card()atm.auth()atm.input_money()atm.bill()atm.take_money()
私有方法的意义
''' 有私有方法 '''classATM(object):# 定义私有方法def__card(self):print('插卡')# 验证权限def__auth(self):print('权限')# 输入取款金额def__input_money(self):print('输入取款金额')# 打印账单def__bill(self):print('账单')# 取款def__take_money(self):print('取款')# 定义一个公有方法 直接对外defwithdraw(self):self.__card()self.__auth()self.__input_money()self.__bill()self.__take_money()# 实例化对象atm=ATM()# 调用公有方法 取款atm.withdraw()# 没有私有方法 只能一个一个调用 用私有方法可以直接调用
类的继承
''' 类的继承 实现代码的重用 减少冗余代码 '''# 定义一个父类Person()classPerson(object):# 定义公共方法defeat(self):print('i can eat food ')defspeak(self):print('i can speak ')def__say_hello(self):print('say hello!')# 定义一个子类 => TeacherclassTeacher(Person):pass# 定义一个子类 => StudentclassStudent(Person):pass# 实例化类 创建对象teacher=Teacher()student=Student()teacher.eat()teacher.speak()teacher.__say_hello()# 私有方法不能继承
Python中的单继承
''' 单继承 同一时间 最多只能继承自某一个已有类 '''# 定义Car 类classCar(object):# 定义一个公共方法defrun(self):print('i can run')# 定义一个油车类classGasolineCar(Car):pass# 定义一个电车类classElectricCar(Car):pass# 实例化操作bmw=GasolineCar()bmw.run()# 单继承只能继承一个父类
类的继承之多层继承
''' 结论:A继承B,B继承C,则A也会继承C 中的所有公有属性和公有方法 => 继承中的传递性 '''classC(object):# 定于一个公共方法deffunc_c(self):print('c')classB(C):# 继承的同时 扩展自身类deffunc_b(self):print('b')classA(B):pass# 实例化A类 创建对象a=A()a.func_b()a.func_c()# 单继承具有传递特性 多层继承
类的多继承特性
''' 多继承 一个类同时继承自多个父类的情况 好处 可以拥有多个类的公有属性和公有方法 '''# 定义油车类classGasolineCar(object):defrun_with_gasoline(self):print('gas')# 定义电车类classElectricCar(object):defrun_with_electric(self):print('electric')# 定义混动车类classHybridCar(GasolineCar,ElectricCar):passtesla=HybridCar()tesla.run_with_electric()tesla.run_with_gasoline()
子类的重写操作
''' 扩展: 子类继承父类的同时 子类应该拥有自己的属性和方法 重写: 如果子类继承了父类 子类中有相同名字的方法或属性 子类的会覆盖父类的 子类优先 '''# 定义一个Animal类classAnimal(object):# 定义一个公共方法defeat(self):print('eat')defcall(self):print('call')# 定义一个Cat子类classCat(Animal):# 在子类中对父类方法进行重写defcall(self):# 强调父类中有这个方法 => 可以在子类中重写print('miao miao')# 定义一个Dog类classDog(Animal):defcall(self):print('wang wang')# 实例化操作cat=Cat()dog=Dog()cat.call()dog.call()# 在子类中 不仅可以扩展父类方法 也可以重写父类方法animal=Animal()animal.call()
重写中的super()方法
''' 当子类重写了父类中的方法 我们还需要调用父类中被重写的方法时 使用 super() '''# 定义一个类classCar(object):# 定义公有属性def__init__(self,brand,model,color):self.brand=brand self.model=model self.color=color# 定义一个子类classElectricCar(Car):# 定义公有属性def__init__(self,brand,model,color,battery):# 继承父类中的__init__()方法 从而实现继承super().__init__(brand,model,color)self.battery=batterydefrun(self):print('i can run with electric')# 实例化对象tesla=ElectricCar('tesla','model 3','blue','70')print(tesla.battery)print(tesla.brand)print(tesla.model)print(tesla.color)tesla.run()
MRO详解类与类之间的继承关系
''' 子类.__mro__ 或 子类.mro() 帮我了解 类与类之间继承关系 '''# 定义一个父类classCar(object):# 定义公共属性def__init__(self,brand,model,color):self.brand=brand self.model=model self.color=color# 定义一个公共方法defrun(self):print('i can run')# 定义一个子类classGasolineCar(Car):defrun(self):print('gas')# 定义一个子类classElectricCar(Car):def__init__(self,brand,model,color,battery):super().__init__(brand,model,color)self.battery=batterydefrun(self):print('e')# 实例化对象tesla=ElectricCar('tesla','model y','blue','70')tesla.run()# MRO继承链print(ElectricCar.mro())print(ElectricCar.__mro__)
Python中多态特性
''' 1.有继承 不是必须的 2.子类重写父类方法 定义一个公共接口 => 随着传入的子类对象不同 返回不同的结果 '''# 父类classFruit(object):# 公共方法defmakejuice(self):print('i can make juice')# 子类classApple(Fruit):# 重写方法defmakejuice(self):print('apple')classBanana(Fruit):# 重写方法defmakejuice(self):print('banana')# 扩展 增加橘子汁功能classOrange(Fruit):defmakejuice(self):print('orange')# 定义多态方法 参数是一个对象 相当于把对象作为参数进行传递defservice(obj):obj.makejuice()# 创建子类对象apple=Apple()service(apple)banana=Banana()service(banana)orange=Orange()service(orange)
python中多态案例
''' 1 有继承 2 有重写 '''# 定义一个父类classDog(object):defwork(self):pass# 有继承 有重写classArmyDog(Dog):defwork(self):print('追人')classDrugDog(Dog):defwork(self):print('追毒')classXiaoTianDog(Dog):defwork(self):print('吃月亮')# 定义一个公共方法classPerson(object):defwork_with_dog(self,dog):dog.work()# 实例化子类对象armydog=ArmyDog()drugdog=DrugDog()xiaotian=XiaoTianDog()police=Person()police.work_with_dog(armydog)police.work_with_dog(drugdog)police.work_with_dog(xiaotian)
面向对象的类属性
''' 实例属性 每个对象都拥有的属性 => 实例属性 类属性 不是每个对象所拥有的 而是所有对象共同拥有的特征 '''# 定义Student学生类classStudent(object):# 类属性count=0# 实例属性def__init__(self,name):self.name=name# 因为实例化对象会自动调用__init__对象Student.count+=1# 实例化对象s1=Student('XM')s3=Student('Xc')s2=Student('XL')# 调用类属性print(f'当前共实例了{Student.count}')print(f'当前共实例了{s1.count}')print(f'当前共实例了{s2.count}')
面向对象中的类方法
''' 结论 类方法 专门用来调用类属性 起到保护数据的作用 class xxx(): count = 0 @classmethod def get_count(cls): 调用count类属性 => cls.count '''# 创建一个工具类classTool(object):# 定义一个类属性count=0# 定义初始化方法def__init__(self,name):self.name=name Tool.count+=1# 定义一个类方法 用于获取类属性@classmethoddefget_count(cls):print(f'当前Tools类中共有{cls.count}个')t1=Tool('1')t2=Tool('2')t3=Tool('3')Tool.get_count()
面向对象中的静态方法
''' 独立函数 不需要调用自身属性也不需要调用自身方法 '''classGame(object):# 定义一个静态menu方法@staticmethoddefmenu():print('开始')print('暂停')print('关闭')# 调用动态方法# 类可以调用Game.menu()# 对象也能调用game=Game()game.menu()
面向对象的综合案例
''' 需求分析 设计一个`Game`类 属性: 定义一个类属性`top_score`记录游戏的历史最高分 定义一个实例属性`player_name`记录当前游戏的玩家姓名 方法: 静态方法`show_help`显示游戏帮助信息 类方法`show_top_score`显示历史最高分 实例方法`start_game`开始当前玩家的游戏 '''classGame(object):top_score=0def__init__(self,player_name):self.player_name=player_name# 静态方法@staticmethoddefshow_help():print('1、开始游戏')print('1、暂停游戏')print('1、关闭游戏')@classmethoddefshow_top_score(cls):print(f'游戏最高分为{cls.top_score}')defstart_game(self):print(f'{self.player_name}开始游戏')