python学习笔记-08

面向对象基础(OOP)-上

1. 面向对象概述

面向过程:根据业务逻辑从上到下写代码
函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可
面向对象(object oriented programming):将数据与函数绑定到一起,进行封装,这样能够更快速的开发程序,减少了重复代码的重写过程。

在进行面向过程编程时,将问题拆解成几个步骤,并将这些步骤一步一步实现。
在进行面向对象时,关注的是设计的过程,类似于甲方,给个方案让别人实现。
面向过程不适合大项目,关注点是怎么做。
面向对象适合大项目,关注点是谁来做。

面向对象编程是一种解决软件复用的设计合编程方法。这种方法把软件系统中相似的操作逻辑合操作应用数据、状态,以类的形式描述出来,以对象实例的形式在软件系统中复用,以达到提高软件开发效率的作用。

2.类和对象

类就是一个模板,模板里可以包含多个函数,函数里实现一些功能,
对象是根据模板创建的实例,通过实例对象可以执行类中的函数。

类相当于制造汽车的图纸,用这个图纸制造的汽车相当于对象。

类的组成部分:
1.类名
2.类的属性:一组数据
3.类的方法:允许对象进行操作的方法
如:
类名:人
属性:身高、体重...
方法:吃、跑...

类是具有一组相同或相似属性和方法的一系列对象的集合,是对象的抽象化。对象是类的实例。

3.定义类和对象

格式:

创建类:
class 类名:
		属性
		方法
实例化对象:
对象名=类名()
#定义类
class Person:
    '''
    属性和对象几个都行
    '''
    name='属性'
    age=20
    def eat(self):
        print('方法')
        pass
    def run(self):
        print('方法2')
        pass
    pass
#创建对象,实例化对象
person=Person()
person.eat()
person.run()
print(person.name,person.age)

在这里插入图片描述

4.实例方法和属性

在类的内部,使用def关键字可以定义一个实例方法,与一般函数定义不同,类方法必须包含参数self(名字标识可以是其他的,但是位置必须存在)且为第一个参数。
实例方法:每个实例都可以调用。
属性:类里面方法外面定义的变量称为类属性,定义在方法内部使用self引用的属性称为实例属性。

#定义类
class Person:
    '''
    属性和对象几个都行
    '''
    age=20
    def eat(self):
        print('方法')
        pass
    def run(self):
        print('方法2')
        pass
    def __init__(self):
        self.name='实例属性'
    pass
#创建对象,实例化对象
person=Person()
person.eat()
person.run()
print(person.name,person.age)

在这里插入图片描述

5.init方法

5.1 引入

class People:
    def eat(self):
        '''
        实例方法
        :return:
        '''
        print('喜欢吃东西')
        pass
    pass
p1=People()
p1.name='同学1'   #也属于实例属性
p1.sex='女'
p1.age=22
p1.eat()
print(p1.name,p1.sex,p1.age)
p2=People()
p2.name='同学2'   #也属于实例属性
p2.sex='女'
p2.age=22
print(p2.name,p2.sex,p2.age)
#如果有n个对象被实例化,就需要重复以上很多次
#故而引入init函数

init函数主要做一些实例属性的声明和初始化的工作,这个函数由系统创建对象时自动执行。
5.2 使用
init方法可以👇

class People:
    #凡是用双下划线圈起来的方法都是python的魔术方法
    def __init__(self):
        '''
        声明实例属性
        '''
        self.name='梨花'
        self.sex='女'
        self.age=11
        pass
    def eat(self):
        '''
        实例方法
        :return:
        '''
        print('喜欢吃东西')
        pass
    pass
p=People()
print(p.name,p.age,p.sex)
#此时如果想重新赋值直接“p.name='新名字'”操作即可

也可以传参👇

class People:
    #凡是用双下划线圈起来的方法都是python的内置方法
    def __init__(self,name,sex,age):
        '''
        声明实例属性
        '''
        self.name=name
        self.sex=sex
        self.age=age
        pass
    def eat(self,food):
        '''
        实例方法
        :return:
        '''
        print(self.name+'喜欢吃'+food)
        pass
    pass
p=People('丽华','南',19)
p.eat('小龙虾')
print(p.name,p.age,p.sex)
#在实例化对象的时候将值传进去,灵活性很高

在这里插入图片描述
5.3 self
self和对象指向同一个内存地址,可以认为self就是对象的引用。

class Person:
    def eat(self):

        print('self的内存地址为%s',id(self))
        pass
    pass
p=Person()
print('p的内存地址为%s',id(p))
p.eat()

在这里插入图片描述
其实所谓的self就是对象自己,相当于Java中的this。某个对象调用其方法时,python解释器会把这个对象作为第一个参数传递给self,所以我们只用传递后面的参数即可。

class Person:
    def __init__(self,pro):
        self.pro=pro
        pass
    def eat(self,name,food):

        print('%s喜欢吃%s修的专业是%s'%(name,food,self.pro))
        pass
    pass
p=Person('计算机')  #初始化时给init中除了self的参数
p.eat('丽丽','龙虾')

在这里插入图片描述

6.魔术方法

在这里插入图片描述
6.1 __str__方法
在这里插入图片描述
在这里插入图片描述

class Person:
    def __init__(self,pro,name,food):
        self.pro=pro
        self.name=name
        self.food=food
        pass
    def __str__(self):
        '''

        :return: 自定义输出的数据内容
        '''
        return '%s喜欢吃%s修的专业是%s'%(self.name,self.food,self.pro)
    pass
p=Person('计算机','丽丽','龙虾')
print(p)

在这里插入图片描述
6.2 __new__方法

class Person:
    def __init__(self,pro,name,food):
        self.pro=pro
        self.name=name
        self.food=food
        print('init函数的执行')
        pass
    def __str__(self):
        '''

        :return: 自定义输出的数据内容
        '''
        return '%s喜欢吃%s修的专业是%s'%(self.name,self.food,self.pro)
    def __new__(cls, *args, **kwargs):
        '''
        cls:是class的缩写
        创建对象实例的方法,每调用一次会生成一个新的实例对象
        不声明系统也会默认调用
        可以控制创建对象的一些属性限定,经常用来做单例模式的时候使用
        :param args:
        :param kwargs:
        '''
        print('new函数的执行')
        return object.__new__(cls)   #不加这句话不创建对象
    pass

p=Person('计算机','丽丽','龙虾')
print(p)
#先执行new函数,如果new函数有创建对象的操作就执行init函数
#new和init的区别:
#new函数是类的实例化方法,必须有return实例,否则对象创建不成功
#init类似于Java中的构造函数,用来做数据属性初始化工作,接受类的实例self并对其进行构造
#new至少有一个参数cls表示要实例化的类,此参数在实例化时由python解释器自动提供

在这里插入图片描述

7.实践–决战紫禁之巅

在这里插入图片描述

import time  #导入时间的包
import random
#定义角色类
class Person():
    def __init__(self,name,blood):
        self.name=name
        self.blood=blood
        pass
    def tong(self,enemy):
        '''
        enemy表示敌人
        :param enemy:
        :return:
        '''
        enemy.blood-=10
        info='[%s]捅了[%s]一刀'%(self.name,enemy.name)
        print(info)
        pass
    def kanren(self,enemy):
        enemy.blood-=15
        info='[%s]砍了[%s]一刀'%(self.name,enemy.name)
        print(info)
        pass
    def chiyao(self):
        self.blood+=10
        info='[%s]吃了一个药丸增加10滴血'%(self.name)
        print(info)
        pass
    def __str__(self):
        return '%s的剩余血量是%d'%(self.name,self.blood)
    pass
xmcx=Person('西门吹雪',100)
ygc=Person('叶孤城',100)
while ygc.blood>0 and xmcx.blood>0:
    i=random.randint(1,6)
    if i==1:
        ygc.tong(xmcx)
        print(xmcx)
        print(ygc)
        pass
    elif i==2:
        xmcx.tong(ygc)
        print(xmcx)
        print(ygc)
        pass
    elif i==3:
        ygc.chiyao()
        print(xmcx)
        print(ygc)
        pass
    elif i==4:
        xmcx.chiyao()
        print(xmcx)
        print(ygc)
        pass
    elif i==5:
        ygc.kanren(xmcx)
        print(xmcx)
        print(ygc)
        pass
    elif i==6:
        xmcx.kanren(ygc)
        print(xmcx)
        print(ygc)
        pass
    print('--------------------')
    time.sleep(1)   #休眠1秒
    pass
if ygc.blood==0:
    print('叶孤城输了')
    pass
if xmcx.blood==0:
    print('西门吹雪输了')
    pass

在这里插入图片描述

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

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

相关文章

防爆气象站:化工厂区气象环境监测的最佳选择

在化工厂区,气象环境监测至关重要,它直接关系到生产安全、环境保护以及员工健康。防爆气象站作为专业的监测设备,凭借其独特的防爆性能和精准的数据监测能力,成为化工厂区气象环境监测的最佳选择。 防爆气象站采用先进的防爆技术…

java 线程之间通信-volatile 和 synchronized

你好,我是 shengjk1,多年大厂经验,努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注!你会有如下收益: 了解大厂经验拥有和大厂相匹配的技术等 希望看什么,评论或者私信告诉我! 文章目录 一…

Studying-代码随想录训练营day14| 226.翻转二叉树、101.对称二叉树、104.二叉树的最大深度、111.二叉树的最小深度

第十四天,(ง •_•)ง💪💪,编程语言:C 目录 226.翻转二叉树 101.对称二叉树 100.相同的树 572.另一个树的子树 104.二叉树的最大深度 559.n叉树的最大深度 111.二叉树的最小深度 总结 226.翻转二叉树 文档讲…

linux 查找和搜索命令

查找传入条件 a:在哪些目录查找 b:查找的内容 find命令: find 目录名 选项 查找条件 find /home/Camera/ -name “*.txt” 解释: /home/Camera/ 指明了查找的路径 -name 表明以名字来查找文件 *.txt 查找名为.txt的文件 grep命令: 在当前目录下查找: grep -n "sample_s…

AI辅助工具革新金融交易编程,引领行业新风尚

今天有伙伴问了我金融方面AI的问题,我来写一下吧 随着人工智能技术的飞速发展,金融交易领域也迎来了新的变革。传统的金融交易编程往往依赖于交易员的专业知识和编程技能,但在人工智能的助力下,自动写代码的AI辅助工具正逐渐崭露…

访问网络 测试没有问题,正式有问题

ping -c 5 -i 1 www.baidu.com 首先检查一下网络,在正式服务器ping 一下要访问的地址。 如果不行,联系网络管理员开通。 笔者因为这个问题浪费了半天时间,一开始都以为是代码问题 以后大家看到这个异常,解决如下: …

对角线法则的由来

目录 一、前言 二、对角线法则 三、行列式的定义 1. 行列式的定义 2. (全)排列 3. 逆序数 四、由全排列逆序数 到 对角线法则规律 ​编辑 五、参考书目 一、前言 仅限于个人理解,对错没有查证。 二、对角线法则 提起对角线法则,我们更倾向于他是…

企业如何选择合适的CRM工具?除Salesforce之外的10大主流选择

对比salesforce,其他10款优秀CRM:纷享销客CRM、Zoho CRM、腾讯企点、销售易、企业微信 (WeCom)、Odoo CR、OroCRM、金蝶、用友CRM、EspoCRM 虽然Salesforce以其全面的功能和强大的市场占有率在海外收获了许多客户,但Salesforce在国内市场的接…

Microsoft AI Day:支持开放合作,普及技术应用,推进行业企业智慧化创新

微软在北京举办以“共创AI创新,智启无限可能”为主题的Microsoft AI Day活动,集中展示了在生成式智能技术加速发展普及的过程中,微软取得的最新技术突破与进展,并同步更新了在Microsoft Build 2024全球开发者大会上发布的一系列Az…

springboot中,将某个函数的日志单独输出的方法

这里写自定义目录标题 背景解决方案解决过程原理 背景 项目中有个节点健康检查扫描功能,每10秒扫描一次节点。 如果节点挂掉,会输出健康检查失败的日志。 测试环境,虽然配置了多个节点,但并没有都启动,所以在扫描的时…

油猴hook+内存爆破

hook方式 说明:来回翻页发现只有请求体的token需要逆向,而这个请求体是在params里,拼接到url里,可以直接用油猴hook url里的关键字token。 正常步骤 hook代码 // UserScript // name hookparams // namespace htt…

前端易遭受的六大安全威胁,以及对应解决策略。

前端遭受安全威胁可能会导致用户隐私泄露、账户被盗用、系统遭受攻击、用户体验受损等严重后果,所有安全防御也成了前端开发者的必须课之一,贝格前端工场带领大家了解下常见的安全威胁。 一、前端开发面临的安全风险 1. 跨站脚本攻击(XSS&a…

项目实施经理岗位的工作内容(合集)

项目实施经理岗位的工作内容1 职责: (1)负责协调软件团队对软件产品的研发工作(包括代码开发,测试,部署实施等); (2)引导和解析客户需求,根据产品特点及用户个性化需求制定解决方案,完成客户宣讲等售前技术支持工作; (…

【CT】LeetCode手撕—141. 环形链表

目录 题目1- 思路2- 实现⭐141. 环形链表——题解思路 3- ACM实现 题目 原题连接:141. 环形链表 1- 思路 模式识别 模式1:判断链表的环 ——> 快慢指针 思路 快指针 ——> 走两步慢指针 ——> 走一步判断环:若快慢相遇则有环&a…

聊聊我构建SMoE模型的过程

这篇博客详细讲述了从头开始构建一个稀疏混合专家(sparse mixture of experts)语言模型的过程。该项目深受 Andrej Karpathy 的 “makemore” 项目启发,并借鉴了许多可重用的组件。与 makemore 类似,makeMoE 也是一种按字符顺序生…

AI与业务的结合 | 使用机器学习预测客户反应,轻松实现市场营销策略优化

01、案例说明 在实际的工作中,除了数据本身需要处理之外,同时也需要对所建立模型进行检验与了解。所以在这个过程之中我们学习2个比较进阶的功能:一个是关于决定属性和结果之间的关系从而判断哪些是更重要的属性;另外一部分则是在…

【CPP】直接选择排序、堆排序

目录 1.选择排序1.1简介1.2代码1.3分析 2.堆排序2.1简介2.2代码2.3分析 1.选择排序 1.1简介 思路:遍历一遍,选出最大值和最小值的下标,然后与第一个和最后一个数字交换位置。 1.2代码 1.3分析 最好复杂度:O(N^2) 最差复杂度&am…

Sui的Fastcrypto加密库刷新速度记录

Sui使用的加密库Fastcrypto打破了许多速度记录,Mysten Labs在基准测试和安全分析中的工作修复了许多安全漏洞,同时通过识别新的优化技巧为创新开辟了道路。 最近在伦敦帝国理工学院举行的国际性能工程会议(ICPE)基准测试研讨会上…

编译原理:代替LR的MP:2.遇到的问题

用指针加速 MP是multi-pass,多遍分析法,它是从“先乘除后加减”中得来的灵感。在实践中,发现C语言优先级有15级,如果将源代码处理15遍,每一遍都从头开始找,势必很慢。所以,有了用指针加速的想法…

开发者配置项、开发者选项自定义

devOptions.vue源码 <!-- 开发者选项 &#xff08;CtrlAltShiftD&#xff09;--> <template><div :class"$options.name" v-if"visible"><el-dialog:custom-class"sg-el-dialog":append-to-body"true":close-on…