# 面向对象三大特征: 封装(定义类), 继承 和 多态 # - 继承(重点) # - 多态(了解, 调用代码的技巧) # # 权限(在什么地方 能够使用 属性和方法): # - 公有权限 # - 私有权限 # # 属性的划分: # - 实例属性(主要使用) # - 类属性 # # 方法的分类: # - 实例方法(主要使用) # - 类方法(会用) # - 静态方法(不会用) # 继承 # 1, 继承描述的是 类与类之间的关系(is ... a) # 2, 好处: 继承之后,子类对象可以直接使用父类中定义的方法和属性(减少代码冗余,提高编程效率) # 继承语法 # class 类B(类A): # B 继承 A, B 子类(派生类), A 父类(基类) # pass # # class 子类(父类): # pass # # # 补充 # class 类名: # 默认继承 object 类, object 类是 Python 中最原始的类 # pass # # 案例1. 定义动物类动物有姓名和年龄属性具有吃和睡的行为 # 2. 定义猫类猫类具有动物类的所有属性和方法并且具有抓老鼠的特殊行为 # 3. 定义狗类狗类具有动物类的所有属性和方法并且具有看门的特殊行为 # 4. 定义哮天犬类哮天犬类具有狗类的所有属性和方法并且具有飞的特殊行为 # class Animal: # def __init__(self, name, age): # self.name name # self.age age # # def eat(self): # print(f{self.name}正在吃东西) # # def sleep(self): # print(f{self.name}正在睡觉) # # # class Cat(Animal): # def catch(self): # print(f{self.name}会抓老鼠) # # # class Dog(Animal): # def guard(self): # print(f{self.name}在汪汪叫) # # # class Xtq(Dog): # def fly(self): # print(f{self.name}会飞) # # # cat Cat(老吴, 3) # cat.eat() # cat.catch() # # dog Dog(旺仔, 4) # dog.sleep() # dog.guard() # # XTQ Xtq(哮天犬, 5) # XTQ.eat() # XTQ.fly() # 继承的传递性 # 只要是 祖先,就可以使用. # 通过对象调用方法: # 1, 会先在自己当前类中,查找这个方法, 找到,就直接调用 # 2, 如果没有找到, 会去 父类中的查找这个方法, 找到,就直接调用 # 3, 如果没有找到, 会去父类的父类中查找, 找到就直接调用 # 4, 没有找到, .... # 5, 直到 object 类, 找到直接使用, # 6, 没有找到,会报错(没有这个属性或者方法) # 重写: 在子类中 定义和父类中名字相同的方法. # 为什么重写: 因为父类中的方法,不能满足子类对象的需要. # 重写的形式: # 1. 覆盖 # 2. 扩展 # # 覆盖是指 父类中原有的功能 全部不要, 子类中全部重新定义. # 步骤: # 1. 在子类中定义和父类名字相同的方法 # 2. 在子类中直接书写新的功能代码 # __str__ # # 扩展式重写 是指 父类中原有的功能 保留,在此基础上 添加新的功能代码 # 步骤: # 1. 在子类中定义和父类名字相同的方法 # 2. 在子类中,使用 super().方法名(参数) 调用父类中的方法 # 3. 在子类中 书写新的功能代码 # 定义狗类, 名字 和 年龄的属性, 叫的方法 class Dog: def __init__(self, name, age): self.name name # 名字 self.age age # 年龄 def bark(self): print(f{self.name}, {self.age} 岁 汪汪汪叫....) # 定义哮天犬类,继承狗类, 嗷嗷嗷叫, 添加一个 法力值的属性 class XTQ(Dog): def __init__(self, name, age, mp): # 之前的属性还要, 直接调用父类中的 __init__方法 super().__init__(name, age) # 扩展式重写 # 添加新的内容, 法力值 self.mp mp def bark(self): # 覆盖式重写 print(f{self.name}修炼{self.age} 年法力值{self.mp} 嗷嗷嗷叫....) # 创建 狗类对象 dog Dog(小狗, 3) dog.bark() # 创建哮天犬类对象 xtq XTQ(哮天犬, 10000, 998) xtq.bark()# 继承的传递性 # 只要是 祖先,就可以使用. # 通过对象调用方法: # 1, 会先在自己当前类中,查找这个方法, 找到,就直接调用 # 2, 如果没有找到, 会去 父类中的查找这个方法, 找到,就直接调用 # 3, 如果没有找到, 会去父类的父类中查找, 找到就直接调用 # 4, 没有找到, .... # 5, 直到 object 类, 找到直接使用, # 6, 没有找到,会报错(没有这个属性或者方法) # 重写: 在子类中 定义和父类中名字相同的方法. # 为什么重写: 因为父类中的方法,不能满足子类对象的需要. # 重写的形式: # 1. 覆盖 # 2. 扩展 # # 覆盖是指 父类中原有的功能 全部不要, 子类中全部重新定义. # 步骤: # 1. 在子类中定义和父类名字相同的方法 # 2. 在子类中直接书写新的功能代码 # __str__ # # 扩展式重写 是指 父类中原有的功能 保留,在此基础上 添加新的功能代码 # 步骤: # 1. 在子类中定义和父类名字相同的方法 # 2. 在子类中,使用 super().方法名(参数) 调用父类中的方法 # 3. 在子类中 书写新的功能代码 # 定义狗类, 名字 和 年龄的属性, 叫的方法 # class Dog: # def __init__(self, name, age): # self.name name # 名字 # self.age age # 年龄 # # def bark(self): # print(f{self.name}, {self.age} 岁 汪汪汪叫....) # # # # 定义哮天犬类,继承狗类, 嗷嗷嗷叫, 添加一个 法力值的属性 # class XTQ(Dog): # def __init__(self, name, age, mp): # # 之前的属性还要, 直接调用父类中的 __init__方法 # super().__init__(name, age) # 扩展式重写 # # 添加新的内容, 法力值 # self.mp mp # # def bark(self): # 覆盖式重写 # print(f{self.name}修炼{self.age} 年法力值{self.mp} 嗷嗷嗷叫....) # # # # 创建 狗类对象 # dog Dog(小狗, 3) # dog.bark() # # 创建哮天犬类对象 # xtq XTQ(哮天犬, 10000, 998) # xtq.bark() # ✨✨✨✨✨✨ # 私有在属性或者方法名的前边 加上 两个下划线_, 这个属性或者方法 就变为私有的 # 前提: 在类内部 # 定义时机1, 某些属性或者方法(根据需求) 不想在类外部被 直接使用 # 2, 写模块让别人使用,某些代码细节,不需要使用的人了解,然后将其定义私有 # ✨✨✨✨✨✨ # 注意因为在类外部 不能直接操作私有, 一般的做法是 定义公有方法,在类外部使用 # 定义人类, 姓名 和 年龄 # class Person: # def __init__(self, name, age): # self.name name # if (age 0) and (age 200): # self.__age age # else: # self.__age 0 # # def __str__(self): # return f{self.name}今年年龄为{self.__age} # # def set_age(self,age): # if (age 0) and (age 500): # self.__age age # else: # print(输入的年龄不正确,应该在 0-150 之间) # # xw Person(小王, 18) # print(xw) # xw.__age 10000 # 不能修改私有属性 age 了 # print(xw) # xw.set_age(10000) # print(xw) # # xl Person(小李, 10000) # print(xl) # ✨✨✨✨✨✨ # # 对象划分python中一切皆对象 # 类对象: 指的就是 类(就是 class 定义的类) # 作用: # - ① 使用类对象 创建实例对象(实例化), 一般称为 创建对象(主要作用) # - ② 保存一些属性值信息, 称为 类属性 # 实例对象 就是 使用 类创建出来的对象(类名()), 也称为 实例 或者 对象(没有特殊强调,我们说的对象 都是 实例对象) # # 作用: # - ① 通过实例对象调用类中的方法 # - ② 保存自己的属性信息值(实例属性) # ✨✨✨✨✨✨ # 类属性就是类对象具有的属性, 称为类属性 # 一般写法, 在类内部、方法的外部(def 的缩进外) 定义的变量, 就是类属性, 一般写在类的开头 # # 调用# 获取 # 类名.类属性 # 补充: 实例对象 也可以获取类属性的值, 前提,没有和类属性名字相同的实例属性(即实例对象查找属性的时候, 先找实例属性,找到就用,找不到,找类属性,找到就用,找不到,报错) # # 修改 # 类名.类属性 属性值 # 内存类属性, 在内存中 只有一份 # ✨✨✨✨✨✨ # 实例属性就是实例对象具有的属性, 称为实例属性 # 定义在类中 的 init 方法中, 使用 self 定义的属性 # 调用 # # 获取 # 实例对象.属性名 # # 添加和修改 # 实例对象.属性名 属性值 # 内存每个实例对象中都存在一份自己的属性信息 # 定义时机 # 如何判断将一个属性定义为 类属性还是实例属性? # 1, 基本上所有的属性都为 实例属性 # 2, 实例属性 描述的是每个对象自己具体的信息, 类属性 描述的是整个类 的信息(类中所有对象 这个属性值都一样) # 3, 看这个属性值信息对于所有的该类对象是否都一样,并且同时变化, 如果是就定义为 类属性,否则就定义为实例属性 # ✨✨✨✨✨✨ # 举例1. 定义一个 工具类 # 2. 每件工具都有自己的 name # 3. 需求 —— 知道使用这个类创建了多少个工具对象? # 提示 # 类名: 工具类 Tools # 属性: 名字 name(实例属性), 创建对象的个数 count (类属性) # 方法: __init__ # class Tools: # count 0 # # def __init__(self, name): # self.name name # Tools.count 1 # print(f创建了一个{self.name}工具目前工具的数量为{ Tools.count}) # # # t1 Tools(板子) # t2 Tools(剪刀)# 题目一 # 定义Animal动物类具有 吃肉 eat的方法()喝 drink的方法叫 sleep的方法 # # 定义 狗Dog 继承了动物类具有汪汪叫 bark的方法, 并重写 eat 方法, 在原有内容的基础上 添加 打印输出吃完东西打了个嗝 # # - 狗 去调用吃的方法 # - 狗 去调用喝的方法 # - 调用 叫的方法 # class Animal: # def __init__(self, name): # self.name name # # def eat(self): # print(f{self.name}在吃肉) # # def drink(self): # print(f{self.name}在喝水) # # def sleep(self): # print(f{self.name}在睡觉) # # class Dog(Animal): # def bark(self): # print(f{self.name}在汪汪叫) # # def eat(self): # print(f{self.name}吃完东西打了个嗝) # # # a1 Animal(小猫) # a1.eat() # a2 Dog(小狗) # a2.bark() # a2.eat() # 题目二 # 1.按如下要求完成代码的编写 # # 1). 定义一个Person类包含姓名和年龄属性要求姓名是公有属性年龄是私有属性 # # 2). 提供获取私有属性的公有方法 get_age方法 # # 3). 提供可以设置私有属性的set_age方法要求如果输入的年龄在 0--120 之间设置年龄否则提示输入不正确 # # 4). 重写 __str__ 要求打印对象时把姓名和年龄都打印出来 # class Person: # def __init__(self, name, age): # self.name name # # if (age 0) and (age 150): # self.__age age # else: # print(输入不正确) # # def set_age(self, age): # if age 200: # self.__age age # else: # print(输入不正确) # # def __str__(self): # return f{self.name}的年龄为{self.__age} # # # p1 Person(小明, 18) # print(p1) # p1.__age 500 # print(p1) # p1.set_age(500) # print(p1) # 题目三 # 定义一个游戏类 Game, 包含 属性 玩家名字 # # 1. 要求记录游戏的最高分(top_score 类属性)和获得最高分的玩家名字(top_score_player), # 2. 定义方法: show_help 显示游戏的帮助信息 输出这是游戏的帮助信息 # 3. 定义方法: show_top_score, 打印输出游戏的最高分 # 4. 定义方法: start_game, 开始游戏, 规则如下 # 1. 使用随机数获取本次游戏得分 范围 (10 - 100 )之间 # 2. 判断本次得分和最高分之间的关系 # - 如果本次得分比最高分高, # - 修改最高分和获得最高分的玩家名字 # - 如果分数小于等于最高分,则不操作 # 3. 输出本次游戏得分 # 步骤1, 查看游戏的帮助信息 # 2, 查看当前的最高分 # 3, 创建一个玩家小王,玩一局游戏, 输出当前最高分和玩家名字 # 4, 创建一个玩家小李,玩一局游戏, 输出当前最高分和玩家名字 # 5, 创建一个玩家小张,玩一局游戏, 输出当前最高分和玩家名字 # import random # # # class Game: # top_score 0 # top_score_player # # def __init__(self, name): # self.player_name name # # staticmethod # def show_help(): # print(显示游戏的帮助信息) # # classmethod # def show_top_score(cls): # print(f最高得分人为{cls.top_score_player},分数为{cls.top_score}) # # # def start_game(self): # score random.randint(10, 100) # print(f{self.player_name} 开始了一句游戏,本次游戏得分为 {score}) # if score Game.top_score: # # 修改历史最高分 # Game.top_score score # Game.top_score_player self.player_name # # # if __name__ __main__: # Game.show_help() # Game.show_top_score() # Game(小王).start_game() # Game.show_top_score() # Game(小李).start_game() # Game.show_top_score() # Game(小张).start_game() # Game.show_top_score()
阅读完成 · 觉得有帮助?