python-面向对象编程

请添加图片描述

面向对象编程

  • 面向对象,python中支持两种编程方式,来写代码,分别是:函数式编程和面向对象

    • 函数式:

      # 定义函数,在函数中实现功能
      def func():
      	print("一个NB的功能")
      
    • 面向对象

      calss FOO(object):
      	def func(self):
              print("一个NB的功能")
      # 实例化对象
      obj = FOO()
      # 执行类中的方法
      obj.func()
      

1.初识面向对象

想要通过面向对象去实现某个或某些功能 需要2步:

  • 定义类,在类中定义方法,在方法中实现具体的功能
  • 实例化类得到一个对象,通过对行去调用并执行方法
class Message:

    def send_email(self, email, content):
        data = "给{}发邮件,内容是:{}".format(email, content)
        print(data)


if __name__ == '__main__': 
    # 实例化一个类 msg_object,创建了一块区域
    msg_object = Message()
    msg_object.send_email("于金龙", "阿龙的代码在报错")

注意:

  • 1.类名称首字母大写&驼峰式命名;-
  • 2.python 3之后默认类都继承object;-
  • 3,在类中编写的函数称为方法;
  • 4.每个方法的第一个参数是self

类中可以右多个方法:

例子:

# -*- coding: UTF-8 -*-
# @Project :luffycity 
# @File    :面向编程.py
# @Author  :于金龙
# @IDE     :PyCharm 
# @Date    :2024/4/7 15:18
class Message:

    def send_email(self, email, content):
        data = "给{}发邮件,内容是:{}".format(email, content)
        print(data)

    def send_message(self, email, content):
        data = "给{}发消息,内容是:{}".format(email,
        print(data)


if __name__ == '__main__':
    msg_object = Message()
    msg_object.send_email("于金龙", "阿龙的代码在报错")
 

1.1 每个类中都可以定义个特殊的:__init__的初始化方法

class Message():
    def __init__(self, content):
        self.data = content

    def send_mail(self, email):
        print("给{}发邮件,内容是:{}".format(email, self.data))

    def send_message(self):
        print("给{}发消息,内容是{}".format(self.data, self.data))

    # 对象 = 类名() # 自动执行类中的:__init__方法。
    # 1.根据类型创建一个对象,内存的一块区域
    # 2.执行__init__方法,模块会将创建的区域的内存地址当self参数传递进去。  往区域中(data="注册成功")


msg_object = Message("注册成功")
msg_object.send_mail("<EMAIL>")

login_object = Message('登录成功')
login_object.send_message("<EMAIL>")

下面的图的对应的上面代码实现
在这里插入图片描述

面向对象的思想:将一些数据封装到对象中,在执行方法时,再去对象中获取。

函数式思想:函数内部需要的数据均通过参数的形式传递。

  • self,本质上就是一个参数。这个参数是内部提供,其实是本质上就是调用当前方法的那个对象。
  • 对象,基于基于类实例化出来的"一块内存",默认里面是没有数据的:经过__init__方法,可以在内存中初始化一些数据。

应用实例:

# TODO:将数据封装到一个对象,以便于以后使用

class userInfo:
    def __init__(self, name, pwd):
        self.name = name
        self.password = pwd


def run():
    user_object_list = []
    while True:
        user = input("用户名:")
        if user.upper() == 'Q':
            break
        pwd = input("密码")
        user_info_object = userInfo(user, pwd)
        user_object_list.append(user_info_object)
    for obj in user_object_list:
        print(obj.name, obj.password)



if __name__ == '__main__':
    run()
#  总结:
1.将数据分装到对象
2.规范数据(做约束)

注意:用字典表示也可以做封装,只不过字典在从操作的时候还需要自己写key值,面向对象.即可获取到封装对象的数据

# TODO:将数据分装到对象中在方法对原始数据进行加工数据
# # 数据准备
user_list = ["用户{}".format(i) for i in range(1, 3000)]
# # 之前的思路(非面向对象方式编程)
# while True:
#     page = int(input("输入页数"))
#     start_page = (page - 1) * 10
#     end_page = page * 10
#     page_list = user_list[start_page:end_page]
#     for item in page_list:
#         print(item)


class Pagination:
    def __init__(self, current_page, page_len=10):
        self.page_len = page_len
        if not current_page.isdecimal():
            self.current_page = 1
            return
        current_page = int(current_page)
        if current_page < 1:
            self.current_page = 1
            return
        self.current_page = current_page

    def start(self):
        return (self.current_page - 1) * self.page_len

    def end(self):
        return self.current_page * 10


if __name__ == '__main__':
    while True:
        page = input("输入页码")
		# 分页显示 
        pg_object = Pagination(page,10)
        page_data_list = user_list[pg_object.start():pg_object.end()]
        for item in page_data_list:
            print(item)
class Police:
    def __init__(self, name, role):
        self.name = name
        if role == "队员":
            self.hit_points = 200
        else:
            self.hit_points = 500

    def status(self):
        message = "警察{}的血值为{}".format(self.name, self.hit_points)
        print(message)

    def bomb(self, t_list):
        for t in t_list:
            t.bool -= 8
            t.show_status()


class Terrorist:
    def __init__(self, name, bool=300):
        self.bool = bool
        self.name = name

    def shoot(self, police_object):
        police_object.hit_points -= 5
        police_object.status()

    def strafe(self, police_object_list):
        for police_object in police_object_list:
            police_object.hit_points -= 8
            police_object.status()

    def show_status(self):
        message = "恐怖分子{},血量值为{}".format(self.name, self.bool)
        print(message)


if __name__ == '__main__':
    r1 = Police("于金龙", "队长")
    r2 = Police("r1", "队员")

    s1 = Terrorist("T1")
    s2 = Terrorist("T1")
    # 警察炸恐怖份子
    r1.bomb([s1, s2])
    # 恐怖分子扫射警察
    s1.strafe([r1, r2])
    # 恐怖分子设计
    s1.shoot(r2)

总结:

  • 仅做数据封装
  • 封装数据+方法再对数据进行加工
  • 创建同一类的数据且同类数据具有相同的功能(方法)
  • 相比函数可以更加规范简洁的实现一些功能

1.2 常见成员

在编写面向对象相关代码时,最常见的成员有:

  • 实例变量,属于对象只能通过对象调用
  • 绑定方法,属于类,同对象调用或通过类调用

注意:处理上面两个还有其他的成员

  • 绑定方法
class Message():
    def __init__(self, content):
        self.data = content
	# 绑定方法
    def send_mail(self, email):
        print("给{}发邮件,内容是:{}".format(email, self.data))

    def send_message(self, email):
        print("给{}发消息,内容是{}".format(email, self.data))

    # 对象 = 类名() # 自动执行类中的:__init__方法。
    # 1.根据类型创建一个对象,内存的一块区域
    # 2.执行__init__方法,模块会将创建的区域的内存地址当self参数传递进去。  往区域中(data="注册成功")


p1 = Message("注册成功")
p1.send_mail("<EMAIL>")
# 第二种方法:直接在类中调用方法,但是类不自动赋值self(不常用)
p1 = Message("注册成功")
Message.send_mail("<EMAIL>")

实例参数

class Message():
	# 实例变量
    def __init__(self, content):
        self.data = content
# 实例化了一个对象,对象内的带有实例化的值self.data = content
p1 = Message("注册成功")
p1.send_mail("<EMAIL>")
# 实例变量属于对象只能通过对象进行调用

2.面向对象-三大特征

2.1 封装

封装主要体现:

  • 将同一类的方法封装到一个类中
  • 将数据封装到了对象种,在实例化一个对象时,可以通过__init__初始化在对象中封装一些数据,以便以后使用

2.2 继承

在传统的理念中有:儿子可以继承父亲的财产

在面向对象中也有这样的理念,即:子类可以继承父类中的方法和类变量(这里的继承并不是拷贝一份,父类的还是属于父类,子类可以继承而已)。

优先在自己类中找,找不到再去父类中查找

class Base:
    def func(self):
        print("Base.func")


class Son(Base):
    def show(self):
        print("Son.func")


s1 = Son()
s1.func()
s1.show()  # 优先在自己的类中找,自己没有才去父类

多态继承

class TCPServer:
    def f1(self):
        print('TCPServer')


class ThreadingMinIn:
    pass


class ThreadedTCPServer(TCPServer, ThreadingMinIn):
    def run(self):
        print("before")
        self.f1()
        print('after')


obj = ThreadedTCPServer()
obj.run()

# 多继承的顺序是自左向右的顺序进行继承

>>> before
>>> TCPServer
>>> after

小结:

  • 执行对象时,方法时,优先当前对象所关联中找,没有的话才去他的父类中查找
  • python支持多继承:先继承左边、再继承右边的。
  • 去self对应的那个类中去获取成员,没有就按继承关系向上查找

2.3 多态

多态,按字面翻译其实就是多种形态。

其他编程语言中,时不允许这种类编写的。

在python中则不一样,由于python对数据类中没有任何限制,所有他天生支持多态

class Email(object):
    def send(self):
        print("发邮件")


class Message(object):
    def send(self):
        print("发消息")


v1 = Email()
v1.send()

v2 = Message()
v2.send()

在程序设计中,这种情况被称为鸭子类型,是一种动态类型的一种风格,在鸭子类型中关注点在于对象的行为,能在什么;而不是对象所属的类型,例如:这个鸟走起来像鸭子、游泳像鸭子,叫起来也像鸭子,那么这只鸟就是鸭子

总结

  • 封装,将方法或者数据封装到对象中,以便后面进行使用
  • 继承,将类中的公共方法提升到基类中
  • 多态,python默认支持多态(这种被称为鸭子类型),最简单的记住下面这段代码即可
def func(arg):
    v1 = arg.copy()  # 浅拷贝
    print(v1)
# func("阿龙的代码在爆粗")
func([11, 22, 33, 44])


int("发消息")


v1 = Email()
v1.send()

v2 = Message()
v2.send()

在程序设计中,这种情况被称为鸭子类型,是一种动态类型的一种风格,在鸭子类型中关注点在于对象的行为,能在什么;而不是对象所属的类型,例如:这个鸟走起来像鸭子、游泳像鸭子,叫起来也像鸭子,那么这只鸟就是鸭子

总结

  • 封装,将方法或者数据封装到对象中,以便后面进行使用
  • 继承,将类中的公共方法提升到基类中
  • 多态,python默认支持多态(这种被称为鸭子类型),最简单的记住下面这段代码即可
def func(arg):
    v1 = arg.copy()  # 浅拷贝
    print(v1)
# func("阿龙的代码在爆粗")
func([11, 22, 33, 44])

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

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

相关文章

git提交代码时报错,提不了

问题 今天在换了新电脑&#xff0c;提交代码时报错 ✖ eslint --fix found some errors. Please fix them and try committing again. ✖ 21 problems (20 errors, 1 warning) husky > pre-commit hook failed (add --no-verify to bypass) 解决 通过 --no-verify 解决&…

JavaScript - 请你说一说对随机数的理解

难度级别:初级及以上 提问概率:40% 在前端开发中,随机数的应用场景非常多,而且也是一个常见的考点。例如网页登录的验证码,看似只有4个随机数字加字母的组合,其实这也是随机数的范畴;例如在抽奖算法中,可以用随机数确定用户中奖的概率…

解决电脑无故自动关机或重启的15种方法,总有一种适合你

序言 你的Windows PC是否在没有警告的情况下关闭或重新启动?这背后有几个潜在的原因。例如,它可能是软件/硬件冲突、过热或硬盘驱动器错误。本故障排除指南将概述在Windows 10/11中修复自动关闭和重新启动的多个解决方案。 如果你的计算机经常关闭,则必须在安全模式下启动…

如何实现异地公网环境访问本地部署的支付宝沙箱环境调试支付SDK

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Flutter如何集成到已有iOS工程上

大家好&#xff0c;我是咕噜铁蛋&#xff0c;今天我将和大家分享一个实用的技术教程——如何将Flutter集成到已有的iOS工程中。Flutter是Google推出的一款开源的移动UI框架&#xff0c;它允许开发者使用Dart语言来开发高性能、美观的原生应用&#xff0c;并支持iOS和Android两大…

DLDP简介

定义 设备链路检测协议DLDP&#xff08;Device Link Detection Protocol&#xff09;用来监控光纤或铜质双绞线&#xff08;例如超五类双绞线&#xff09;的链路状态。如果发现单向链路存在&#xff0c;DLDP协议会根据用户配置&#xff0c;自动关闭或通知用户手工关闭相关接口…

ai绘画软件有哪些?这几款宝藏AI绘图别错过

今天我要和你们分享一些令人兴奋的AI绘画软件。这些软件不仅能够让你的创作过程更加有趣&#xff0c;还能帮助你提升绘画技巧。快来看看吧&#xff01; 首先&#xff0c;我们来介绍一款备受推崇的软件——【爱制作AI】。 爱制作AI是国内专业的AI原创内容写作平台&#xff0c;结…

JavaScript - 你知道Ajax的原理吗?如何封装一个Ajax

难度级别:中高级及以上 提问概率:75% 想要实现Ajax,就需要创建它的核心通信对象XMLHttpRequest,通过核心对象的open方法与服务端建立连接,核心对象的send方法可以将请求所需数据发送给服务端,服务端接收到请求并做出响应,我们通过核心对象…

技术再度取得优势,人工智能兴起推动需求,美芯涨价收割市场,收割中国制造?...

独家首发 ------------- 分析机构指出一季度全球存储芯片涨价了15%左右&#xff0c;而近期三星半导体预测全球存储芯片的价格还将继续上涨&#xff0c;预计二季度至少上涨两成&#xff0c;显示出美系芯片在忍受了一年多的亏损之后再度联手涨价。 2022年中国存储芯片取得了重大进…

2024/4/2—力扣—最小高度树

代码实现&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ struct TreeNode* buildTree(int *nums, int l, int r) {if (l > r) {return NULL; // 递归出口}struct…

戴维贝拉×实在智能丨RPA助力商家线上线下一体化运营,关键指标可随时查看!

戴维贝拉&#xff08;dave&bella&#xff09;创立于2011年&#xff0c;是杭州日冠服饰有限公司旗下婴幼服饰品牌&#xff0c;至今已立足服装业10余年。2012年&#xff0c;戴维贝拉就已经成为电商销售国内前十的品牌。2021年双十一&#xff0c;戴维贝拉再次以傲人的战绩稳居…

GIS与数字孪生共舞,打造未来智慧场景

作为一名数字孪生资深用户&#xff0c;近日我深刻理解到GIS&#xff08;地理信息系统&#xff09;在构建数字孪生体中的关键作用。 数字孪生技术旨在构建现实世界的虚拟镜像&#xff0c;而GIS则是这一镜像中不可或缺的空间维度框架和导航灯塔。数字孪生的核心是通过数字化方式…

数据结构---绪论

一、绪论&#xff1a; 1.什么是数据&#xff1f; 数据是信息的载体&#xff0c;是描述客观事物属性的数&#xff0c;字符及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。数据是计算机程序加工的原料。 数据元素--描述一个个体 数据元素&#xff0c;数据项&am…

开源AI程序员SWE-Agent的实现方法

1 引子 前几天&#xff0c;AI 编程机器人 Devin 引起了热议。传言称&#xff1a;程序员的饭碗就要丢了。这两天&#xff0c;一个类似功能的产品 SWE-Agent 开源&#xff0c;在 SWE-Bench 上实现了与 Devin 类似的效果。下面让我们来看看 AI 程序员的具体实现方法。 2 信息 地…

Redis(字典hash表)

字典也可以称为Map、关联数组、映射、符号表。字典表在C语言中没有实现&#xff0c;所以Redis知己实现了字典。 在字典中一个key对应一个value。key是唯一的。这些关联的键和值称为键值对。 ​ 字典的应用非常广泛&#xff0c;Redis数据库的底层实现就是字典&#xff0c;对数据…

vue+springboot多角色登录

①前端编写 将Homeview修改为manager Manager&#xff1a; <template><div><el-container><!-- 侧边栏 --><el-aside :width"asideWidth" style"min-height: 100vh; background-color: #001529"><div style"h…

程序汪10万接的垃圾回收小程序,开发2个月

本项目来自程序汪背后的私活小团队&#xff0c;开发了一个垃圾回收小程序里面涉及物联网&#xff0c;给粉丝分享一下解决方案&#xff0c;希望给想接私活的朋友一些经验参考 程序汪10万接的垃圾回收小程序&#xff0c;开发2个月 视频版本 在 B站【我是程序汪】 目录 一、项目构…

怎么用3D渲染效果图?

3D渲染效果图是一种通过计算机软件生成的三维图像&#xff0c;它模拟了物体在真实世界中的外观和感觉。这种图像通常用于展示建筑设计、室内设计、产品设计等项目的最终效果。通过3D渲染效果图&#xff0c;我们可以更直观地展示和展示我们的创意和想法。那么怎么用3D渲染效果图…

【javaWeb 原理篇】底层实现原理(快速学习配置原理,Bean管理)

Spring底层 配置优先级Bean管理获取beanBean的作用域第三方Bean SpringBoot原理起步依赖自动配置自动配置的原理自定义starter 配置优先级 Spring中的配置文件如果配置了相同的内容则根据配置优先级进行配置: application.properties>application.yml>application.yaml …

【IMU系列】什么是传感器的ODR和FSR实际如何配置传感器

使用更高的ODR信号有两个主要缺点&#xff1a;内存限制和功耗 以实际传感器为例