Python——面向对象

前言

        小伙伴们好久不见,本期我们了解一下Python中面向对象的一些基础知识,为以后的上位机学习做下基础,因为前面我们对c语言进行了系统学习,所以Python基础知识我们就不做阐述了,逻辑基本相同,就是书写的格式有所差别。本期内容简洁明了,主要展示示例代码。

类的方法和基本使用

介绍及要求

"""
定义类格式:
# Python3以后,3种写法完全等价
#class 类名:
#class 类名():
class 类名(object): # 新式类写法,object所有类的祖先
    方法的定义

注意:类名 建议 大驼峰命名法

类的设计
类名: 人类(Person)
属性: 无
方法: 吃饭(eat)/运动(run)

1. 定义类,只是定义了一个类型
2. 根据类创建对象(实例化对象), 通过设计图创建一个实物
    格式:  实例对象变量名 = 类名() # 小括号一定不能省略
3. 类外面方法如何调用
    对象变量.方法名字()
"""

示例代码

class Person():
    def eat(self):
        print(f"{self.name}吃饭")
        
P = Person()
P.name = "mike"
P.eat()

运行结果

类外添加和使用属性

介绍及要求

"""
在类的外面操作对象属性:
1. 创建对象变量(实例化对象)
2. 添加属性:对象.属性 = 内容
    注意:
    1. 第一赋值叫添加属性,下一次赋值叫修改属性
    2. 类外添加属性,了解即可
3. 使用属性:对象变量.属性
"""

示例代码

class Person():
    def eat(self):
        print(f"{self.name}吃饭")
        
P = Person()
P.name = "mike"
P.eat()

运行结果

self参数的使用

介绍及要求

"""
1. self是什么?
    谁调用方法,self就是那个谁
    tom对象调用eat方法,self就是tom对象
2. 如何访问属性和方法
    类方法里面: self.属性、self.方法()
    类外面:    对象变量名.属性、对象变量名.方法()
"""

示例代码

lass Person():
    def eat(self):
        print(f"{self.name}吃饭")

P = Person()
P.name = "Mike"
P.eat()

运行结果

无参__init__方法使用

介绍及要求

"""
__init__方法(双下划线,不是单下划线):
    1. 作用:初始化,添加属性
        self.属性变量名 = 内容
    2. 特点:创建对象的时候,实例化对象,自动调用__init__方法

类名:Person
属性:name
方法:
    __init__(): 添加属性,属性内容为'小明'
    eat(): 打印xx爱吃饭, xx替换为具体的属性
"""

示例代码

class Person():
    def __init__(self):
        self.name = "mike"
    def eat(self):
        print(f"{self.name}在吃饭")
P = Person()
P.eat()

运行结果

有参__init__方法使用

介绍及要求

"""
__init__方法(双下划线,不是单下划线):
    1. 作用:添加属性
    2. 特点:创建对象的时候,实例化对象,自动调用__init__方法
    3. 设置参数,创建对象时,除了self参数不用人为处理,其它参数需要和__init__参数匹配
        对象名 = 类名(实参1, 实参2) ====》 __init__(self, 形参1, 形参2)
"""

示例代码

class Person():
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def eat(self):
        print(f"{self.name}在吃饭,{self.age}岁了")
P = Person("mike",18)
P.eat()

运行结果

__str__方法使用

介绍及要求

"""
__str__方法:
    0. 作用:方便打印对象的属性信息
    1. 返回值必须是字符串类型,不是返回print
    2. print(对象变量名)  对象变量名的位置替换为__str__()方法返回值的内容
"""

示例代码

class Person():
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def eat(self):
        print(f"{self.name}在吃饭,{self.age}岁了")
    def __str__(self):
        return f"姓名:{self.name},年龄:{self.age}"
    
P = Person("mike",18)
P.eat()
print(P)

运行结果

面向对象:摆放家具

介绍及要求

"""
需求:
1. 房子(House) 有 户型、 总面积、剩余面积 和 家具名称列表
    - 新房子没有任何的家具、剩余面积和总面积相等
2. 家具(HouseItem) 有 家具名字 和 家具面积, 其中
    - 席梦思(bed) 占地 4 平米
    - 衣柜(chest) 占地 2 平米
    - 餐桌(table) 占地 1.5 平米
3. 将以上三件 家具 添加 到 房子 中
    - 向房间 添加家具 时, 让 剩余面积 -= 家具面积
4. 打印房子时, 要求输出: 户型、 总面积、 剩余面积、 家具名称列表

家具类
类名:HouseItem
属性:家具名称name、家具面积area
方法:
    __init__(): 添加属性
    __str__(): 以字符串格式返回属性信息


房子类
类名:House
属性:户型house_type、 总面积area、剩余面积free_area 和 家具名称列表item_name_list
方法:
    __init__(): 添加属性
    __str__(): 以字符串格式返回属性信息
    add_item(): 添加家具,需要一个形参house_item接收家具对象
"""

示例代码

# 家具类
class HouseItem():
    def __init__(self,name,area):
        self.name = name
        self.area = area
    def __str__(self):
        return f"名称:{self.name},面积:{self.area}"

# 房子类
class House():
    def __init__(self,house_type,area):
        self.house_type = house_type
        self.area = area
        self.free_area = area
        self.item_name_list = []
    def __str__(self):
        return f"户型:{self.house_type},面积:{self.area},剩余面积:{self.free_area},家具名称列表:{self.item_name_list}"
    def add_item(self,temp:HouseItem):
        if self.free_area >= temp.area:
            print(f"添加家具{temp.name}成功,面积为{temp.area}平米")
            self.free_area -= temp.area
            self.item_name_list.append(temp.name)
        else:
            print(f"添加家具{temp.name}失败,剩余面积不足")

H = House("四居室",100)

# 席梦思(bed) 占地 4 平米
bed = HouseItem("bed",4)
print(bed)
H.add_item(bed)
print(H)
# 衣柜(chest) 占地 2 平米
chest = HouseItem("chest",2)
print(chest)
H.add_item(chest)
print(H)
# 餐桌(table) 占地 1.5 平米
table = HouseItem("table",1.5)
print(table)
H.add_item(table)
print(H)

运行结果

访问权限

介绍及要求

"""
说明: 当属性和方法只需要在类定义内部使用时, 就可以使用私有属性和私有方法

定义格式:
私有属性: __属性名
私有方法: def __方法名():

女孩类:
类名:Girl
实例属性:
    姓名name
    年龄__age
实例方法:
    __init__() 添加实例属性
    __secret() 打印年龄
    use_private() 公共方法
"""

示例代码

class Girl():
    def __init__(self,name,age):
        self.name = name
        self.__age = age
    def __secret(self):
        print(self.__age)
    def use_private(self):
        self.__secret()
g = Girl("小明",18)
print(g.name)
g.use_private()

运行结果

封装

介绍及要求

"""
需求:
• 进入某 Web 项目登录页面, 输入用户名、 密码、 验证码之后登录系统
要求:
• 用户名为'admin',密码为'123abc',验证码为:'abcd',返回登陆成功,否则,返回登陆失败

类名:LoginPage
实例属性:用户名username、密码password、验证码verify_code
实例方法:
    __init__(): 添加属性
    __str__(): 返回字符串格式的属性信息
    login(): 登陆
"""

示例代码

class LoginPage():
    def __init__(self,username,password,verify_code):
        self.username = username
        self.password = password
        self.verify_code = verify_code
        
    def __str__(self):
        return f"用户名:{self.username}\n密码:{self.password}\n验证码:{self.verify_code}\n"
    def login(self):
        if self.username == "admin" and self.password == "123abc" and self.verify_code == "abcd":
            return "登陆成功"
        else:
            return "登陆失败"
lp = LoginPage("admin","123abc","abcd")
print(lp)
res = lp.login()
print(f"登录结果:{res}")

运行结果

继承

介绍及要求

"""
继承:复用代码,继承过来的东西可以复用,描述类和类之间的关系
格式:
class 子类名(父类名):
    pass

# 父类,也叫基类
# 子类,也叫派生类

父类名:Person
实例属性:name, age
实例方法:
    __init__() 添加实现属性
    say_hello() 打印 xxx say hello,今年 xxx 岁

子类名:Student 继承于 Person类
类里面没有实现任何功能
"""

示例代码

class Person():
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def say_hello(self):
        print(f"姓名:{self.name},年龄:{self.age}")
        
class Student(Person):
    pass

s = Student("mike",18)
s.say_hello()

运行结果

继承的重写

介绍及要求

"""
重写:重新写(定义)一次父类的同名方法
为什么需重写:父类同名方法不满足需求
子类如何调用父类同名方法:super().父类同名方法(参数)

父类名:Person
实例属性:name, age
实例方法:
    __init__() 添加实现属性
    say_hello() 打印 xxx say hello,今年 xxx 岁

子类名:Student 继承于 Person类
实例属性:新增score
实例方法:
    重写__init__()方法:调用父类的__init__,再增加score
    go_school(): 打印: xxx 去考试,得分:xxx
"""

示例代码

class Person():
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def say_hello(self):
        print(f"姓名:{self.name},年龄:{self.age}")
    
class Student(Person):
    def __init__(self,socre,name,age):
        super().__init__(name,age)
        self.socre = socre
    def goto_school(self):
        print(f"{self.name} 去考试,得分:{self.socre}")
        
s = Student(90,"mike",20)
s.goto_school()
s.say_hello()

运行结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/338210.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android学习之路(22) ARouter原理解析

1.ARouter认知 首先我们从命名来看:ARouter翻译过来就是一个路由器。 官方定义: 一个用于帮助 Android App 进行组件化改造的框架 —— 支持模块间的路由、通信、解耦 那么什么是路由呢? 简单理解就是:一个公共平台转发系统 工作方式&…

安装RabbitMQ sentos并挂载

1. usr/local/software/mq/data 创建data目录, mkdir data 2. 拉取镜像 docker pull rabbitmq 3.配置网络 docker network create --driver bridge --subnet172.18.12.0/16 --gateway172.18.1.1 wn_docker_net 4. 设置参数并创建挂载 docker run -it \ --name rabbitmq \…

SpringBoot 3.1.7 集成Sentinel

一、背景 我的项目需要引入限流,降级,熔断框架,由于 Spring Cloud 2022.0.4 已经不再支持 Hystrix,Spring Cloud 提供了替代方案,如 Resilience4j,可以使用它来替换 Hystrix。但是网上搜了一下国内Resilie…

Axure RP 9 动态面板

目录 轮播图绘制 多种方式登录 前言: 轮播图绘制、多种方式登录界面绘制 轮播图绘制 首先绘制一个动态面板 在概要区域选中动态面板进入State1面板中插入图片绘制 双击图片绘制插入本地图片,右键State1重复状态并更改图片 点击交互面板新建交互将需要添加…

【微服务】springcloud集成sleuth与zipkin实现链路追踪

目录 一、前言 二、分布式链路调用问题 三、链路追踪中的几个概念 3.1 什么是链路追踪 3.2 常用的链路追踪技术 3.3 链路追踪的几个术语 3.3.1 span ​编辑 3.3.2 trace 3.3.3 Annotation 四、sluth与zipkin概述 4.1 sluth介绍 4.1.1 sluth是什么 4.1.2 sluth核心…

linux 使用笔记

1.查看运行内存 a.Free 快速查看内存的方法,也是经常使用的命令, -h 更人性化的显示内存的单元 -m 以M的形式显示 b.Top Top命令提供了实时性的运行中的程序的资源使用统计。可以根据内存的使用和大小来进行排序。 如上所示,top命令可以看…

Servlet系列两种创建方式

一、使用web.xml的方式配置(Servlet2.5之前使用) 在早期版本的Java EE中,可以使用XML配置文件来定义Servlet。在web.xml文件中,可以定义Servlet的名称、类名、初始化参数等。然后,在Java代码中实现Servlet接口&#x…

C++逆向分析New_Delete

一个运行程序是一定有四个区域,分别是:代码区,数据区,栈区,堆区。 栈区我们知道,是函数传参保存临时变量的一段内存空间。那么堆区是干嘛的呢? 堆区就是动态开辟的一块内存空间,用…

年味渐近 其乐龍龍!2024四川省网联会年货节闪亮来袭!

1月19日,“其乐龍龍2024四川省网联会年货节”正式启动,此次活动由四川省网联会主办,以直播、短视频多种形式在抖音、微博、小红书等多平台同步呈现,旨在为广大消费者带来一场别开生面的年货盛宴,助力激发消费活力。 年…

数据结构:链式队列

队列是限制在两端操作进行插入操作与删除操作的线性表,允许进行插入操作的一端称为"队尾",允许进行删除操作的一端称为“队头”。当线性表中没有元素时,称为“空队”。队列的特点是先进先出。 队列两种规定: 1、front…

2024年网络安全比赛--内存取证(超详细)

一、竞赛时间 180分钟 共计3小时 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 1.从内存文件中找到异常程序的进程,将进程的名称作为Flag值提交; 2.从内存文件中找到黑客将异常程序迁移后的进程编号,将迁移后的进程编号作为Flag值提交; 3.从内存文件中找到受害者…

计算机体系结构——多处理机系统

一、概述 重要概念 评估指标 通信延迟 通信延迟=发送开销+跨越时间+传输延迟+接收开销 跨越时间 数字信号从发送方的线路端传送到接收方的线路端所经过的时间。 传输时间 全部的消息量除以线路带宽。 多处理机的架构 根…

考研数学:幂函数凑微分的三道典型例题

题目 01 题目 02 题目 03 详细内容和更多题目解析在:荒原之梦考研数学

Python Timer定时器:控制函数在特定时间执行

Thread类有一个Timer子类,该子类可用于控制指定函数在特定时间内执行一次。例如如下程序: from threading import Timerdef hello():print("hello, world") # 指定10秒后执行hello函数 t Timer(10.0, hello) t.start() 上面程序使用 Timer …

Pandas.DataFrame.mean() 平均值 详解 含代码 含测试数据集 随Pandas版本持续更新

关于Pandas版本: 本文基于 pandas2.1.2 编写。 关于本文内容更新: 随着pandas的stable版本更迭,本文持续更新,不断完善补充。 Pandas稳定版更新及变动内容整合专题: Pandas稳定版更新及变动迭持续更新。 Pandas API参…

初始RabbitMQ(入门篇)

消息队列(MQ) 本质上就是一个队列,一个先进先出的队列,队列中存放的内容是message(消息),是一种跨进程的通信机制,用于上下游传递消息, 为什么使用MQ: 削峰填谷: MQ可以很好的做一个缓冲机制,例如在一个系统中有A和B两个应用,A是接收用户的请求的,然后A调用B进行处理. 这时…

C++ STL之string的使用及模拟实现

文章目录 1. 前言2. 介绍3. string类的使用3.1 string类的构造函数3.2 string类对象的容量操作3.3 string类对象的访问及遍历操作3.4 string类对象的修改操作3.5 string类对象的字符串操作3.6 string类的非成员函数 4. string类的模拟实现 1. 前言 C语言中,字符串是…

如何在 Ubuntu / Raspbian 上安装 MariaDB

Raspberry Pi OS(原为Raspbian)是为树莓派基于Debian开发的操作系统。 从2015年起,树莓派基金会正式将其作为树莓派的官方操作系统。 Raspbian是由Mike Thompson和Peter Green创建的一个独立项目。第一个版本于2012年6月发布,至…

php基础学习之变量

php使用变量的必要性 PHP 是一种动态网站开发的脚本语言,动态语言特点是交互性,会有数据的传递,而 PHP作为“中间人”,需要进行数据的传递,传递的前提就是 PHP 能自己存储数据(临时存储) php变量的命名规则 必须以do…

Android Studio 之 菜单 Menu

选项菜单 OptionsMenu 用xml添加&#xff08;更建议使用&#xff09; 创建一个菜单布局 : 在 res文件下新建一个menu 目录&#xff0c;此时的菜单id为&#xff1a;R.menu.option <?xml version"1.0" encoding"utf-8"?> <menu xmlns:android&…