Python ❀ 面对对象(一)_无糖可乐没有灵魂的博客-程序员秘密

技术标签: 面对对象(一)  开发  编程  Python  

Python学习计划(九)

面对对象(一)

一、面向对象思想
张老师吃饭,饭从哪里来?
(1)自己做

  • 买菜
  • 洗菜
  • 切菜
  • 做饭
    (2)女朋友做
  • 女朋友.买菜
  • 女朋友.洗菜
  • 女朋友.切菜
  • 女朋友.做饭

面向过程编程最易被初学者接受,其往往用一长段代码来实现指定功能,开发过程的思路是将数据与函数按照指向的逻辑顺序组织在一起,数据与函数分开考虑。

面向过程:根据业务逻辑从上到下写代码。查询是执行者
面向对象:将数据与函数绑定到一起,进行封装,对外界提供调用。程序员是指挥者

面向对象的思维解决问题的重点:
(1)当遇到一个需求的时候不用自己取实现,如果自己一步步实现那就是面向过程
(2)应该找一个专门做这个事的人来做
(3)面向对象是基于面向过程的

二、类与对象
面向对象编程的两个非常重要的概念:类和对象
对象是面向对象编程的核心,在使用对象的过程中,为了将具有共同特征和行为的一组对象抽象定义,提供了另外一个新的概念—类
类就相当于制造飞机时的图纸,用它来进行创建的飞机就相当于对象。

1、
类是抽象的,在使用的时候通常会找到这个类的一个具体的存在,使用这个具体的存在,这个存在就是对象,一个类可以找到多个对象

2、对象
某一个具体事物的存在,在现实世界中可以是看得见摸得着的
可以是直接使用的

3、类与对象的关系:
类就是创建对象的模板

4、类的组成:
类的名称:类名
类的属性:一组数据
类的方法:允许操作的方法(行为)

5、类的抽取:
如何把日常生活中的十五抽象成抽象中的类?
拥有相同或者类似的属性和行为的对象都可以抽象出一个类
一般名词都是类

三、定义类
定义一个类,格式如下:

class 类名:
	方法列表

四、创建对象
定义了一个car类,就好比车有一个图纸,那么接下来就应该把图hi交给生成工人们去生成了
pyhon中,可以根据已经定义的类去创建出一个个对象
创建对象的格式为:

对项目=类名()

例如:

BMW=Car0
BMW.color = '黑色'
BMW.wheelNum = 4
BMW.move()
BMW.toot()
print(BMW.color)
print(BMW.wheelNum)

注意:

  • BMW = Car(),这样就产生了一个Car的实例对象,此时也可以通过实例对象BMW来访问属性或者方法
  • 第一次使用BMW.color = '黑色’表示给BMW这个对象添加属性,如果后面再次出现BMW.color = xxx表示对属性进行修改
  • BMW是一个对象,它拥有属性(数据)和方法(函数)

五、init()函数
在上一小节的demo中,我们已经给BMW这个对象添加了2个属性,wheelNum(车的轮胎数量)以及color(车的颜色),试想如果再次给创建一个对象的话,肯定也需要进行添加属性,显然这样做很费事,那么有没有办法能够在创建对象的时候,就顺便把车这个对象的属性给设置呢?
通过_init_()函数为对象初始化属性值

#定义汽车类

class Car:
	def _init_(self):
		self.wheelNum = 4
		self.color = '蓝色'
	def move(self):
		print('车在跑,目标:夏威夷')

#创建对象

BMW = Car()
print('车的颜色为:%s'%BMW.color)
print('车轮胎数量为:%d'%BMW.wheelNum)

当创建Car对象后,在没有调用_init_()方法的前提下,BMW就默认拥有了2个属性wheelNum和color,原因就是_init_()方法是在创建对象后,就立刻被默认调用了(为对象属性进行初始化赋值)。
这种对象的属性进行赋值的行为称之为默认初始化
这样子每个对象创建处理,属性值都一样,不能体现多样性,能不能再创建对象的同时对对象属性进行赋值呢?

def _init_(self,newWheelNum,newColor):
	self.wheelNum = newWheelNum
	self.color = newColor

这种对象的属性进行赋值的行为称之为针对性初始化

  • init(self)方法,在创建一个对象时默认调用,不需要手动调用
  • init(self)中,默认有1个参数名字为self,如果在创建对象时传递了2个实参,那么_init_(self)中除了self作为一个形参外还需要2个形参
  • init(self)中的self参数,不需要开发者传递,python解释器会自动把当前的对象引用传递进去

六、str()函数
当我们通过print()函数将对象进行打印时,打印的是该对象的类型和地址。
如果想打印对象时,出来的是对象的一些属性值,怎么办呢?

def _str_(self):
	msg = '嘿'
	return msg

当使用print输出对象的时候,只要自己定义了_str_(self)方法,那么就会打印从在这个方法中return的数据

七、self关键字
所谓的self,可以理解为自己
可以把self当作C++中类里面的this指针一样理解,就是对象自身意思
某个对象调用其方法时,python解释器会把这个对象作为第一个参数传递给self,所以开发者只需要传递后面的参数即可

八、面向对象的应用案例
烤土豆应用:
示例属性如下:

  • cookedLevel:这是数字;0-3表示还是省的,超过3表示半生不熟,超过5表示已经烤好了,超过8表示已经烤成木炭了!我们的地瓜开始是生的
  • cookedString:这是字符串;描述地瓜的生熟程度
  • condiments:这是地瓜的配料列表,比如番茄酱、芥末酱等
    示例方法如下:
  • cook():八地瓜烤一段时间
  • addCondiments():给地瓜添加配料
  • init():设置默认的属性
  • str():让print的结果看起来更好一点

九、隐藏数据
如果有一个对象,当需要却对其进行修改属性时,有2中方法

  • 对象名.属性名 = 数据 ----> 直接修改
  • 对象名.方法名() ----> 间接修改
    为了更好的保存属性安全,即不能随便修改,一般的处理方式为
  • 将属性定义为私有属性
  • 添加一个可以调用的方法,供调用
class people(object):
	def _init_(self,name):
		self._name = name
	def getName(self):
		return self._name
	def setName(self,newName):
		if len(newName) >= 5:
			self._name = newName
		else:
			print('error:名字疮毒需要大于或者等于5')
xiaoming = people('HENG')
print(xiaoming._name)

python中没有像java中public和private这些关键字来区别公有熟悉和私有属性
它是以属性命名方式来区分,如果在属性名前面加了2个下划线,则表没该属性是私有属性,否则为公有属性。

十、del()函数
创建对象后,python解释器默认调用_init_()方法
当删除一个对象十,python解释器也会默认调用一个方法,这个方法为_del_()方法

  • 当有1个变量保存了对象的引用时,此对象的引用技术就会加1
  • 当使用del删除变量指向的对象时,如果对象的引用技术不是1,比如3,呢么此时只会让这个引用技术减1,即变为2,当再次调用del时,变为1,如果再调用1次del,此时会真的把对象进行删除

创作者:Eric· Charles

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_42197548/article/details/84946663

智能推荐

开源的前端GIS空间分析库介绍 (二)jsts与ol结合_前端ol库_此爱如少年的博客-程序员秘密

openlayers是一个偏重量型的前端GIS可视化类库,但是它基本上不具备空间分析运算的能力。举个例子,比如:1、判断线与线是否交叉2、线是否穿过多边形当然,它还是具备了一些简单的空间运算能力,比如geometry对象...

springboot---->javax.servlet.ServletException_weixin_30338743的博客-程序员秘密

springboot访问静态资源时发生以下异常:javax.servlet.ServletException: Circular view path [login]: would dispatch back to the current handler URL [/login] again经过查找原因可知如下结果:由于重名了,spingboot不知道该执行哪个路径,所以报错。待深入...

pyinstaller打包Django项目成为exe程序_django 输出 exe_喵言喵语喵常在的博客-程序员秘密

1.环境win10 + Python3.6 + Django (2.1.10) + PyInstaller (4.2)安装方式一:在线安装pip install pyinstaller此处我是直接在我的虚拟环境在线安装#方式二:离线安装future-0.18.2.tar.gzpefile-2019.4.18.tar.gzaltgraph-0.17-py2.py3-none-any.whlpywin32_ctypes-0.2.0-py2.py3-none-any.whlpyinsta

redis smembersmap_redis八种基本数据类型及其应用_缥缈孤鸿影子的博客-程序员秘密

NoSQL 开发中或多或少都会用到,也是面试必问知识点。最近这几天的面试每一场都问到了。但是感觉回答的并不好,还有很多需要梳理的知识点。这里通过几篇 Redis 笔记整个梳理一遍,后面再加上面试题。Redis 系列:1、Redis 的五大数据类型Redis-key127.0.0.1:6379> keys *(empty list or set)127.0.0.1:6379> set n...

SpringCloud的服务注册中心(二)注册中心服务端和两个微服务应用客户端_weixin_34032827的博客-程序员秘密

一、构建EurekaServer工程1、pom.xml2、application.yml3、 EurekaServerApp.java4、启动EurekaServer二、构建部署 EurekaClient 应用ServiceHelloA,端口 82011、pom.xml2、bootstrap.properties3、ServiceHelloApp.java4、Ser...

EasyUI框架06——其他控件_$.messager.show_武汉小喽啰的博客-程序员秘密

1.Combobox下拉框1)获取下拉文本值$("#deptName").combobox("getText")2)获取下拉框的value$("#deptName").combobox("getValue")3)去掉下拉框的倒三角$(".combo").click(function(){ if ($(this).prev().combobox("pa...

随便推点

preg_match_all函数详解_fjnjxr的博客-程序员秘密

1、preg_match_all —执行一个全局正则表达式匹配int preg_match_all( string $pattern , string$subject [, array&$matches [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0 ]]] )搜索subje

军事科学院南华大学计算机,丁琳-计算机科学与技术学院_杨小熠的博客-程序员秘密

丁琳,女,1981年4月出生,博士,副教授,硕士研究生导师,湖南省高校青年骨干教师,加拿大University of British Columbia访问学者,主要研究方向为网络安全与复杂网络。近五年来,主持国家自然科学基金、湖南省自然科学基金、湖南省哲学社会科学基金等国家级及省厅级科研课题7项,以第一作者身份在国内外重要学术期刊上发表科研论文10余篇,其中6篇被SCI/EI收录,参与编写教材1部...

pwnable.kr 之echo1_qq_33528164的博客-程序员秘密

缓冲区溢出新解题目链接:http://pwnable.kr/play.php 分析:该程序是一个64位的elf文件,运行程序.输入name,选择选项.hey, what's your name? : bill- select echo type -- 1. : BOF echo- 2. : FSB echo- 3. : UAF echo- 4. : exit大致流程就这样.看到有三个选项

使用Vue3api实现svg-icon的全局引入(未使用TS,只是在原Vue2升级)_vue3-svg-icon_前端程序媛~柚子的博客-程序员秘密

因为在vue3项目中直接将原vue2中全局组件svg迁移时,完全按照vue2的写法,发现无法实现,所以就记录一下,方便日后查找1.安装npm install svg-sprite-loader -S2.配置文件vue.config.jsconst path = require('path')function resolve(dir) { return path.join(__dirname, dir)}module.exports={ chainWebpack: config =&

Centos 安装EMQX,使用自带的SSL双向认证,并用java验证_centos emqx_mylove_2009的博客-程序员秘密

Centos 安装EMQX,使用自带的SSL,并用java验证centos7安装EMQXEMQ X的SSL1.证书转换,将 client-key.pem 转换成 pkcs8 格式的证书:2.修改emqx.conf配置3.emqtt重启4.mqtt.fx客户端测试java模拟SSL连接centos7安装EMQX使用EMQ官网,选择系统环境和安装方式,进行下载安装emqx broker使用指南中依赖包安装、特定版本安装、启动方式等命令。EMQ X的SSL/emqx/etc/certs里面存储自带的服

Objective-C 非主流代码技巧_black-heart的博客-程序员秘密

我是前言看开源代码时,总会看到一些大神级别的代码,给人眼前一亮的感觉,多数都是被淡忘的C语言语法,总结下objc写码中遇到的各类非主流代码技巧和一些妙用:[娱乐向]objc最短的方法声明[C]结构体的初始化[C]三元条件表达式的两元使用[C]数组的下标初始化[objc]可变参数类型的block[objc]readonly属性支持扩展的写法[C]小括号内联复合表达式[娱乐向]奇葩的C

推荐文章

热门文章

相关标签