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()  # 执行结果:这是游戏的帮助信息

 

posted @ 2022-12-16 22:53  十一10086  阅读(40)  评论(0编辑  收藏  举报