python学习笔记整理04(面向对象)
1.概念
2.编写步骤
3.魔法方法
4.封装
5.私有和公有
6.继承
7.重写
8.多态
9.属性和方法
1.概念
2.编写步骤
# 1.创建类 # 用 class 关键字定义类,类名用大驼峰命名法 class Cat: # 创建方法,方法本质是函数 # self 是普通形参,python 解释器在执行代码的时候自动将调用这个方法的对象传递给了self,其本质是对象,只是对象是全局变量,self 是函数中的局部变量 def eat(self): # 添加属性:对象.属性名 = 属性值,获取属性:对象.属性名 # 类内部添加:self.属性名,一般写在__init__中 print('小猫{self.name}吃鱼的方法') # 2.创建对象 # 用 类名() 创建对象,将对象保存到变量中 blue_cat = Cat() #3.调用方法 # 类外部添加:对象.属性名,一般不用类外部添加 blue_cat = '蓝猫' blue_cat.eat()
3.魔法方法
# 魔法方法:形式为 __方法__ ,在满足某个特定条件下会自动调用的方法 class Cat: # 1.初始化方法__init__ # 场景:创建对象后会自动调用 # 用途:①添加属性,②书写类中每次都会调用的重复代码 def __init__(self, name, age): self.name = name self.age = age # 2.默认输出方法__str__ # 场景:print() 打印对象时会自动调用 # 用途:书写对象的属性信息,若未定义,默认输出对象的引用地址 # 注意:必须返回一个字符串 def __str__(self): return f'小猫名字是{self.name},年龄是{self.age}岁' # 3.析构方法__del__ # 场景:程序代码运行结束,所有对象都被销毁 def __del__(self): print(f'{self.name}的代码结束了') blue_cat = Cat('蓝猫', 2) # 创建对象时传参,与__init__定义的参数要一致 print(blue_cat) # 打印对象输出__str__返回字符串 # 可在结束前使用 del 对象 来删除对象,但若对象有多个名字(即多个对象引用同一个对象),需要把所有对象名删除才可以真的删除这个对象 # 代码执行结束后会打印__del__结果内容
4.封装:定义类的过程称为封装,即将属性和方法封装到一个抽象的类中
5.私有和公有:在 python 中定义的方法和属性,可以添加访问控制权限,分为私有权限和公有权限
class Person: def __init__(self, name, age, weight): # 公有权限的写法:直接书写 # 公有的方法和属性可以在任意地方访问和使用 self.name = name self.age = age # 私有权限的写法:在方法或属性名前加 __ # 私有的方法和属性只能在类内部使用 self.__weight = weight def __str__(self): return f'{self.name}今年{self.age}岁了,现在体重是{self.__weight}公斤' xm = Person('小明', 18, 50) xm.age = 19 # 公有属性可修改 xm.weight = 40 # 私有属性不可修改 print(xm) # 执行结果:小明今年19岁了,现在体重是50公斤 # 补充:对象.__dict__ 魔法属性,可以将对象具有的属性组成字典返回 print(xm.__dict__) # {'name': '小明', 'age': 19, '_Person__weight': 50, 'weight': 40}
6.继承
# 书写父类(基类) # 最原始的父类是 object,一般可省略书写 class Animal: def __init__(self, name): self.name = name def eat(self): print(f'{self.name}吃东西') # 书写子类(派生类) # 子类继承父类的语法:class 子类(父类): class Dog(Animal): def bark(self): print(f'{self.name}要狗叫') # 单继承:一个类只能继承一个父类 class XTQ(Dog): pass # 继承特点:子类继承父类后,子类的对象可以直接使用父类的属性和方法 xm = XTQ('哮天犬') # 继承的调用方法模式:先在当前类中查找,若有直接调用,若没有去父类中查找...直到在object中仍没有查找方法,代码报错 xm.eat() xm.bark()
7.重写
# 重写:在子类中定义与父类名字相同的方法 # 父类方法无法满足子类需求时可以重写,重写后子类对象直接调用子类方法 class Dog: def bark(self): print('汪汪汪叫') class Xtq(Dog): # 覆盖:在子类中直接书写新的代码 def bark(self): print('嗷嗷嗷叫') class Ceq(Dog): # 扩展:在子类中合适的地方调用父类的方法,并添加新方法 def bark(self): print('嘻嘻嘻叫') # 调用父类方法的语法:super().方法名() # super(object) 是一个继承到 object 的类 super().bark() print('哈哈哈叫') xtq = Xtq('哮天犬') xtq.bark() ceq = Ceq('嫦娥犬') ceq.bark()
8.多态
# 多态:不同的对象 调用 相同的方法,产生 不同的执行结果,以增加代码的灵活度 # 定义不同岗位的类 class Person: def work(self): print('人需要工作') class Coder(Person): def work(self): print('开发人员 --> 工作是写代码') class Tester(Person): def work(self): print('测试人员 --> 工作是测试项目') # 定义 公司类,方法:查看不同岗位的工作, 参数:人类对象 # 在这个方法中调用 work方法 class Company: def show_work(self, worker): worker.work() c = Company() cc = Coder() tt = Tester() c.show_work(cc) # 执行结果:开发人员 --> 工作是写代码
9.属性和方法
import random # 1.1 类对象:就是 类,可理解为 类名 # 类对象是 python 解释器在执行代码的过程中创建的 class Game: # 2.1类属性:类 具有的属性信息 # 定义:一般会在 类内部 方法外部 直接定义 # 使用:类名.属性名 top_score = 0 # 3.1 实例方法:在 类内部 直接书写的方法 # 使用:对象.方法名() def __init__(self, name): # 2.2 实例属性:实例对象 具有的属性信息 # 定义:一般会在 init方法中定义 # 使用:self.属性名 self.name = name # 3.2 类方法:使用 @classmethod 装饰器的方法 # 场景:不需要实例属性但需要类属性的时候 # 使用方式一:类对象.方法名() # 使用方式二:实例对象.方法名() @classmethod # 使用类方法 def show_game(cls): print(f'游戏当前的最高分是:{Game.top_score}分') # 3.3 静态方法:使用 @staticmethod 装饰器的方法 # 场景:既不需要实例属性也不需要类属性的时候 # 使用方式一:类对象.方法名() # 使用方式二:实例对象.方法名() @staticmethod # 使用静态方法 def show_help(): print('这是游戏的帮助信息') def start_game(self): print(f'{self.name}开始一局游戏,', end='') score = random.randint(10, 101) # 本次游戏得分 print(f'本次游戏得分为{score}') if score > Game.top_score: # 修改最高分 Game.top_score = score # 1.2 实例对象:用 类名() 创建的对象,类的实例化:创建对象的过程 xm = Game('小明') xm.start_game() # 执行结果:小明开始一局游戏,本次游戏得分为66 xm.show_game() # 执行结果:游戏当前的最高分是:66分 xm.start_game() # 执行结果:小明开始一局游戏,本次游戏得分为26 xm.show_game() # 执行结果:游戏当前的最高分是:66分 xm.show_help() # 执行结果:这是游戏的帮助信息