Python_面向对象属性与方法

Python完全采用了面向对象的思想,是真正面向对象的编程语言,完全支持面向对象的基本功能,例如:继承、多态、封装等。Python中,一切皆对象。我们在前面学习的数据类型、函数等,都是对象。

 

面向过程和面向对象的区别面向过程和面向对象都是对软件分析、设计和开发的一种思想,它指导着人们以不同的方式去分析、设计和开发软件。C语言是一种典型的面向过程语言,Java是一种典型的面向对象语言。

面向过程是什么?面向过程适合简单、不需要协作的事务,重点关注如何执行。面向过程时,我们首先思考“怎么按步骤实现?”。比如,如何开车?我们很容易就列出实现步骤:

但是当我们思考比较复杂的设计任务时,比如“如何造车?”,就会发现列出1234这样的步骤,是不可能的。那是因为,造车太复杂,需要很多协作才能完成。此时面向对象思想就应运而生了。

面向对象(Oriented-Object)思想更契合人的思维模式。我们首先思考的是"怎么设计这个事物?”。比如思考造车,我们就会先思考“车怎么设计?”,而不是“怎么按步骤造车的问题”。这就是思维方式的转变。天然的,我们就会从“车由什么组成”开始思考:

为了协作,我们找轮胎厂完成制造轮胎的步骤,发动机厂完成制造发动机的步骤;这样,发现大家可以同时进行车的制造,最终进行组装,大大提高了效率。具体到轮胎厂的一个流水线操作,仍然是有步骤的,还是离不开执行者、离不开面向过程!、

面向对象和面向过程总结

1 .都是解决问题的思维方式,都是代码组织的方式。

2.面向过程是一种“执行者思维",解决简单问题可以使用面向过程

3.面向对象是一种“设计者思维”,解决复杂、需要协作的问题可以使用面向对象

1.简单数据像30,40,50.4等这些数字,可以看做是简单数据。最初的计算机编程,都是像这样的数字。

2.C语言中的数组将同类型的数据放到一起。比如:整数数组[20,30,40],浮点数数组[10.2,11.3,12.4],字符串数组:[“aa”,”bb”,”cc”]⚠️上面的[20,30,40]不是python中的列表,是C语言中的数组

3.C语言中的结构体将不同类型的数据放到一起,是C语言中的数据结构。比如:

Struct resume{int age;char name[10];double salary;
};

4.对象将不同类型的数据、方法(即函数)放到一起,就是对象。比如:

class Student:company = "SXT"     #类属性count = 0           #类属性def __init__(self,name,score):self.name = name         #实例属性self.score = scoreStudent.count = Student.count+1def say_score(self):           #实例方法print("我的公司是:",Student.company)print(self.name,'的分数是:',self.score)

类可以看做是一个模版,或者图纸,系统根据类的定义来造出对象。我们要造一个汽车,怎么样造?类就是这个图纸,规定了汽车的详细信息,然后根据图纸将汽车造出来。类:我们叫做class。对象:我们叫做object,instance(实例)。以后我们说某个类的对象,某个类的实例。是一样的意思。

对象是类的具体实体,一般称为“类的实例”。类看做“饼干模具”,对象就是根据这个“模具”制造出的“饼干”。从一个类创建对象时,每个对象会共享这个类的行为(类中定义的方法),但会有自己的属性值(不共享状态)。更具体一点:“方法代码是共享的,属性数据不共享”。

【操作】一个典型的类的定义

class Student:def __init__(self,name,score): #构造方法第一个参数必须为selfself.name = name         #实例属性self.score = scoredef say_score(self):           #实例方法print("{0}的分数是{1}".format(self.name,self.score))
s1 = Student('张三',80)  #s1是实例对象,自动调用__init__()方法
s1.say_score()

对象完整内存结构类是抽象的,也称之为“对象的模板”。我们需要通过类这个模板,创建类的实例对象,然后才能使用类定义的功能。我们前面说过一个Python对象包含三个部分:id(identity识别码)、type(对象类型)、value(对象的值)。现在,我们可以更进一步的说,一个Python对象包含如下部分:

实例属性实例属性是从属于实例对象的属性,也称为“实例变量”。他的使用有如下几个要点:1实例属性一般在__init__()方法中通过如下代码定义:self.实例属性名=初始值2在本类的其他实例方法中,也是通过self进行访问:self.实例属性名3创建实例对象后,通过实例对象访问:obj01=类名()#创建和初始化对象,调用__init__()初始化属性obj01.实例属性名=值#可以给已有属性赋值,也可以新加属性

class Student:def__init__(self,name,score):self.name = name     #增加name属性self.score = score   # 增加score属性def say_score(self):self.age = 18     #增加age属性print("{0}的分数是{1}".format(self.name,self.score))
s1 = Student("张三",80)
s1.say_score()
print(s1.age)
s1.salary = 3000  #s1对象增加salary属性
s2 = Student("李四",90)
s2.say_score()
print(s2.age)

【操作】测试类对象的生成

class Student:pass    #空语句
print(type(Student))
print(id(Student))
Stu2 = Student
s1 = Stu2()
print(s1)

    静态方法通过装饰器@staticmethod来定义,格式如下:

@staticmethod
def  静态方法名([形参列表]):
方法体

【操作】静态方法使用测试:

class Student:company = "SXT"  #类属性@staticmethoddef add(a, b):  #静态方法print("{0}+{1}={2}".format(a,b,(a+b)))return a+b
Student.add(20,30)

#析构函数
class Person:def __del__(self):print("销毁对象:{0}".format(self))
p1 = Person()
p2 = Person()
del p2print("程序结束")

__call__方法和可调用对象

1.Python中,凡是可以将()直接应用到自身并执行,都称为可调用对象。

2.可调用对象包括自定义的函数、Python内置函数、以及本节所讲的实例对象。

3.定义了__call__()的对象,称为“可调用对象”,即该对象可以像函数一样被调用。

4.该方法使得实例对象可以像调用普通函数那样,以“对象名()”的形式使用。

def f1():print("f1")
f1()   #本质也是调用了__call__()方法
class Car:  def __call__(self, age,money):print("__call__方法")print("车龄:{0},金额:{1}".format(age,money))
f2 = Car()
f2(3,200000)    #像调用函数那样调用,本质也是调用了__call__()

#测试方法的动态性
class Person:def work(self):print("努力上班!")
def play_game(self):print("玩游戏")
def work2(s):print("好好工作,努力上班!")
Person.play = play_game
Person.work = work2
p = Person()
p.play()
p.work()

我们可以看到,Person动态的新增了play_game方法,以及用work2替换了work方法

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java | Leetcode Java题解之第430题扁平化多级双向链表

题目: 题解: class Solution {public Node flatten(Node head) {dfs(head);return head;}public Node dfs(Node node) {Node cur node;// 记录链表的最后一个节点Node last null;while (cur ! null) {Node next cur.next;// 如果有子节点&#xff0…

【最基础最直观的排序 —— 选择排序算法】

最基础最直观的排序 —— 选择排序算法 选择排序算法是一种简单直观的排序算法。其基本思想是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小&a…

【JS】Reflect

对象基本方法 JS语法操作对象时,本质上是调用一个内部封装好的函数,该函数中又会调用对象的基本方法,通过官方文档可以看到基本方法。在过去,这些对象的基本方法是不会对外暴露的。 如下面这段代码,使用JS语法给对象赋…

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-20

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-20 1. Multimodal Fusion with LLMs for Engagement Prediction in Natural Conversation Authors: Cheng Charles Ma, Kevin Hyekang Joo, Alexandria K. Vail, Sunreeta Bhattacharya, Alvaro Fern’andez Ga…

网络层协议——IP

目录 IP层 IP报文格式 IP的理解 运营商 分片与组装 IP层 传输层的TCP或者UDP协议能直接将数据发送到网络中吗?显然不能,封装完的TCP报文还是需要向下交付,经过协议栈,从链路层发送到物理层也就是网路中。 那么tcp做了什么工…

9.创新与未来:ChatGPT的新功能和趋势【9/10】

创新与未来:ChatGPT的新功能和趋势 引言 在探讨人工智能的发展历程时,我们可以看到它已经从早期的图灵机和人工神经网络模型,发展到了今天能够模拟人类智能的复杂系统。人工智能的起源可以追溯到20世纪40年代,而它的重要里程碑包…

【ARM】MDK-当选择AC5时每次点击build都会全编译

1、 文档目标 解决MDK中选择AC5时每次点击build都会全编译 2、 问题场景 在MDK中点击build时,正常会只进行增量编译,但目前每次点击的时候都会全编译。 3、软硬件环境 1 软件版本:Keil MDK 5.38a 2 电脑环境:Window 10 4、解决…

centos7 配置 docker 国内镜像源

1.修改配置文件/etc/docker/daemon.json sudo vim /etc/docker/daemon.json2.增加或修改以下配置内容 {"registry-mirrors": ["https://dockerproxy.com","https://hub-mirror.c.163.com","https://mirror.baidubce.com","http…

网页爬虫法律与道德:探索法律边界与道德规范

目录 引言 一、网络爬虫技术概述 1.1 定义与功能 1.2 技术原理 1.3 案例分析 二、网络爬虫的法律边界 2.1 合法性要求 2.2 刑事风险 2.3 案例分析 三、网络爬虫的道德规范 3.1 尊重版权和隐私 3.2 合理使用爬虫技术 3.3 透明度和社会责任 四、技术挑战与应对策略…

面试经典 150 题:力扣88. 合并两个有序数组

每周一道算法题启动 题目 【题目链接】 【解法一】合并后排序 排序后的数组自动省略0的数字&#xff0c;又学到了 class Solution { public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {//合并两个数组后排序for(int i0; i<…

傅里叶变换及其应用笔记

傅里叶变换 预备知识学习路线扼要描述两者之间的共同点&#xff1a;线性运算周期性现象对称性与周期性的关系周期性 预备知识 学习路线 从傅里叶级数&#xff0c;过度到傅里叶变换 扼要描述 傅里叶级数&#xff08;Fourier series&#xff09;&#xff0c;几乎等同于周期性…

面经 | ES6

ES6 ES6Promise对象创建Promise三个状态resolve/reject 和微任务的关系await set vs weakSetmap vs weakMap ES6 Promise对象 new Promise(excutor);excutor是一个函数,会立刻执行;then里的回调函数&#xff0c;会进入微任务队列&#xff1b;then会返回一个新的promise对象aw…

LeetCode 面试经典150题 137.只出现一次的数字II

题目&#xff1a; 给你一个整数数组 nums &#xff0c;除某个元素仅出现 一次 外&#xff0c;其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。 思路&#xff1a; 方法一&#xf…

Java | Leetcode Java题解之第435题无重叠区间

题目&#xff1a; 题解&#xff1a; class Solution {public int eraseOverlapIntervals(int[][] intervals) {if (intervals.length 0) {return 0;}Arrays.sort(intervals, new Comparator<int[]>() {public int compare(int[] interval1, int[] interval2) {return i…

如何把python(.py或.ipynb)文件打包成可运行的.exe文件?

将 Python 程序打包成可执行的 .exe 文件&#xff0c;通常使用工具如 PyInstaller。这是一个常用的 Python 打包工具&#xff0c;可以将 Python 程序打包成独立的可执行文件&#xff0c;即使没有安装 Python 也能运行。 步骤&#xff1a; 1. 安装 PyInstaller 使用 conda 安…

风力发电机叶片表面缺陷识别检测数据集yolo数据集 共7000张

风力发电机叶片表面缺陷识别检测数据集yolo数据集 共7000张 风力发电机叶片表面缺陷识别数据集&#xff08;Wind Turbine Blade Defects Recognition Dataset, WTBDRD&#xff09; 摘要 WTBDRD 是一个专门为风力发电机叶片表面缺陷识别而设计的数据集&#xff0c;旨在为相关领…

HttpServletRequest简介

HttpServletRequest是什么&#xff1f; HttpServletRequest是一个接口&#xff0c;其父接口是ServletRequest&#xff1b;HttpServletRequest是Tomcat将请求报文转换封装而来的对象&#xff0c;在Tomcat调用service方法时传入&#xff1b;HttpServletRequest代表客户端发来的请…

HTML5好看的水果蔬菜在线商城网站源码系列模板2

文章目录 1.设计来源1.1 主界面1.2 商品列表界面1.3 商品详情界面1.4 其他界面效果 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/142059220 HTML5好看的水果蔬菜在线商城…

FortiGate OSPF动态路由协议配置

1.目的 本文档针对 FortiGate 的 OSPF 动态路由协议说明。OSPF 路由协议是一种 典型的链路状态(Link-state)的路由协议,一般用于同一个路由域内。在这里,路由 域是指一个自治系统,即 AS,它是指一组通过统一的路由政策或路由协议互相交 换路由信息的网络。在这个 AS 中,所有的 …

OTTO奥托机器人开发总结

OTTO机器人是一个开源外壳&#xff0c;硬件和软件的桌面机器人项目&#xff0c;非常适合新手研究和拓展。 我一直希望找一个合适的项目入手研究机器人&#xff0c;这种项目最好是软硬件都开源的&#xff0c;可以随着自己的想法无限的扩展和私人订制&#xff0c;做为初学者&…