一、面向过程和面向对象

1.面向过程:是一种以事件为中心的编程思想,更关注过程。简单的问题可以用面向过程的思路来解决,直接有效,但是当问题的规模变得更大时,用面向过程的思想是远远不够的。所以慢慢就出现了面向对象的编程思想。

  • 优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、 Linux/Unix等一般采用面向过程开发,性能是最重要的因素。
  • 缺点:不易维护、复用和拓展

2.面向对象:世界上的每个人或事务都能看成一个对象,每个对象都有自己的属性和行为,对象与对象之间通过方法来交互。面向对象是一种以“对象”为中心的编程思想,把要解决的问题分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个对象在整个解决问题的步骤中的属性和行为。

  • 优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易于维护
  • 缺点:性能比面向过程低

3.扩展:高内聚、低耦合

①内聚:模块内部的代码,例如方法,变量,对象,或者是功能模块。相互之间的联系越强,内聚就越高,模块的独立性就越好。一个模块应该尽量的独立,去完成独立的功能

②耦合:模块与模块之间有些操作是有关联的,例如水桶效应,一个水桶若是有一块木板比其他木板短,那么这个水桶装的水也就会相应减少,因此模块与模块之间的关系越是紧密,独立性就越不好,就容易产生连锁反应

③模块:就是将大型系统的复杂问题,分成不同的小模块,去处理问题

二、类和对象

1.类:

①定义:类是抽象的,在使用的时候通常会找到这个类的一个具体的存在,使用这个具体的存在。一个类可以找到多个对象

②构成:三部分

  • 类的名称:类名
  • 类的属性:一组数据
  • 类的方法(行为):允许对其进行操作的方法

③举例:人类

  • 名称:人
  • 属性:姓名、身高、年纪
  • 方法:吃饭、睡觉、上厕所

④抽象类:拥有相同(或者类似)属性和行为的对象都可以抽像出一个类

⑤举例:小明在公交车上牵着一只叼着热狗的狗

  • 小明 --- 人类
  • 公交车 --- 交通工具类
  • 热狗 --- 实物类
  • 狗 --- 狗类

⑥格式:

#动物类
class Animal(object):#猫的实例方法def cat(self):pass#狗的实例方法def dog(self):pass

说明:

  • object是Python里所有类的最顶级父类
  • 类名的命名规则按照"大驼峰命名法"
  • cat和dog是实例方法
  • 第一个参数一般是self,表示实例对象本身,也可以使用其它的名字,其作用是设置一个变量,这个变量指向了实例对象

2.对象:

①定义:某一个具体事物的存在 ,在现实世界中可以是看得见摸得着的。可以是直接使用的

②案例(实例化对象):

对象名1 = 类名()
对象名2 = 类名()
对象名3 = 类名()#创建动物类
class Animal(object):#实例方法def cat(self):print(self)print("我是一只修牟")def dog(self):print("我是一只修勾")
#实例化对象
a=Animal()
#默认打印对象存在的内存地址
print(a)
#id(实例化对象) 输出内存地址的十进制表达形式
print(id(a))

③添加和获取对象的属性:

#创建英雄类
class Hero(object):#实例方法def attack(self):print("英雄放出了大招")def move(self):print("英雄放出了闪现")
#实例化对象
h=Hero()#给对象添加属性,以及对应的属性值
h.name="武则天"
h.hp=2333
h.atk=666
h.voice="普天之下,莫非王土"#通过 . (成员选择运算符),获取实例化对象的属性值
print("❤英雄%s的血量为:%d❤"%(h.name,h.hp))
print("❤英雄%s的攻击为:%d❤"%(h.name,h.atk))
print("❤英雄%s的语音为:%s❤"%(h.name,h.voice))#通过 . (成员选择运算符),获取实例化对象的实例方法
h.attack()
h.move()

④在方法内通过self获取对象属性:

#创建英雄类
class Hero(object):def attack(self):print("英雄放出了大招")def move(self):print("英雄放出了闪现")def info(self):#在类的实例方法中,通过self获取对象的属性值print("❤英雄%s的血量为:%d❤" % (self.name, self.hp))print("❤英雄%s的攻击为:%d❤" % (self.name, self.atk))print("❤英雄%s的语音为:%s❤" % (self.name, self.voice))
#实例化对象
h=Hero()#给对象添加属性,以及对应的属性值
h.name="武则天"
h.hp=2333
h.atk=666
h.voice="普天之下,莫非王土"#通过 . (成员选择运算符),获取实例化对象的实例方法
h.info()
h.attack()
h.move()

三.魔法方法:

1.介绍:Python的类里提供的,两个下划线开始,两个下划线结束的方法,就是魔法方法

2.__init__():

①定义:

  • __init__()就是一个魔法方法,通常用来做属性初始化或赋值操作,在实例化对象的时候会被自动调用
  • __init__(self)中的self参数,不需要开发者传递,python解释器会自动把当前的对象引用传递过去。
  • 如果类面没有写__init__方法,Python会自动创建,但是不执行任何操作
  • 一个类里无论自己是否编写__init__方法一定有__init__方法

②案例:

#创建英雄类
class Hero(object):def __init__(self):# 给对象添加属性,以及对应的属性值self.name = "貂蝉"self.hp = 5555self.atk = 444self.voice = "来欣赏妾身的舞姿吧"def attack(self):print("英雄放出了大招")def move(self):print("英雄放出了净化")def info(self):#在类的实例方法中,通过self获取对象的属性值print("❤英雄%s的血量为:%d❤" % (self.name, self.hp))print("❤英雄%s的攻击为:%d❤" % (self.name, self.atk))print("❤英雄%s的语音为:%s❤" % (self.name, self.voice))
#实例化对象
h=Hero()#通过 . (成员选择运算符),获取实例化对象的实例方法
h.info()
h.attack()
h.move()

③有参数的__init__()方法:

  • 在类内部获取属性和实例方法,通过self获取
  • 在类外部获取属性和实例方法,通过对象名获取
  • 如果一个类有多个对象,每个对象的属性是各自保存的,都有各自独立的地址
  • 但是实例方法是所有对象共享的,只占用一份内存空间。类会通过self来判断是哪个对象调用了实例方法
#创建英雄类
class Hero(object):def __init__(self,name,hp,atk,voice):# 给对象添加属性,以及对应的属性值self.name = nameself.hp = hpself.atk = atkself.voice = voicedef attack(self):print("对你放出了小心心")def move(self):print("开启大招加移速")def info(self):#在类的实例方法中,通过self获取对象的属性值print("❤英雄%s的血量为:%d❤" % (self.name, self.hp))print("❤英雄%s的攻击为:%d❤" % (self.name, self.atk))print("❤英雄%s的语音为:%s❤" % (self.name, self.voice))
#实例化对象
dj=Hero("妲己",2000,5000,"主人~来和妲己玩耍吧")
yyh=Hero("杨玉环",6666,1234,"云想衣裳花想容,春风拂槛露华浓")#通过 . (成员选择运算符),获取实例化对象的实例方法
dj.info()
dj.attack()
print("*"*30)
yyh.info()
yyh.move()

3.__str__():

①定义:

  • 当使用print输出对象的时候,默认打印对象的内存地址。如果类定义了__str__(self)方法,那么就会打印在这个方法中 return 的数据
  • __str__方法通常返回一个字符串,作为这个对象的描述信息

②案例:

#创建人物类
class Characters():def __init__(self,name,skills):self.name=nameself.skills=skillsdef labs(self):print("我是野原新之助")def info(self):print("人物名字为%s,擅长的技能为%s"%(self.name,self.skills))#实例化对象
c=Characters("小新","大象舞")
#print输出对象,默认输出内存地址
print(c)
#输出十进制内存地址
print(id(c))
#输出信息
c.info()
#创建修勾类
class Dogs():def __init__(self,color,body):self.color=colorself.body=bodydef labs(self):print("我是拉布拉多")def __str__(self):#在类的实例方法中,通过self获取对象的属性值#__str__方法通常返回一个字符串,作为这个对象的描述信息# return "❤修勾的颜色为%s,体型为%s❤"%(self.color,self.body)return "abc"
#输出对象 内容为__str__中return的值
d=Dogs("棕色","strong")
print(d)

4.__doc__:

①定义:查看类的文档说明,也就是类的注释,只输出三单引号或者三双引号内的注释

②案例:

#创建修勾类
class Dogs():'''创建init方法'''def __init__(self,color,body):self.color=colorself.body=bodydef labs(self):print("我是拉布拉多")def __str__(self):"""在类的实例方法中,通过self获取对象的属性值__str__方法通常返回一个字符串,作为这个对象的描述信息return "❤修勾的颜色为%s,体型为%s❤"%(self.color,self.body)"""return "abc"
#__doc__输出类的多行注释
print(Dogs.__doc__)
print(Dogs.__str__.__doc__)

5.__del__():

①定义:当删除对象时,python解释器会默认调用一个方法,这个方法为__del__()方法

②案例:

#创建英雄类
class Hero(object):def __init__(self,name):print("__init__被调用")self.name = namedef __del__(self):print("__del__被调用")print("%s被猴子敲死了"%self.name)
#创建对象
h=Hero("鲁班")
#删除对象
print("%d被删除1次"%id(h))
del(h)

6.__dict__:

①定义:调用__dict__ 方法,查询类或者对象的成员

②案例:

#创建人物类
class Characters():def __init__(self,name,skills):self.name=nameself.skills=skillsdef labs(self):print("我是野原新之助")def query(self):for k,v in self.__dict__.items():print(k,v)#查看类成员
print("类成员:",Characters.__dict__)
#查看对象成员
c=Characters("野原新之助","大象舞")
print("对象成员:",c.__dict__)
#调用定义的__dict__方法获取成员
c.query()
#运行结果
类成员: {'__module__': '__main__', '__init__': <function Characters.__init__ at 0x000002287A8B9A20>, 'labs': <function Characters.labs at 0x000002287A8B9AB0>, 'query': <function Characters.query at 0x000002287A8B9B40>, '__dict__': <attribute '__dict__' of 'Characters' objects>, '__weakref__': <attribute '__weakref__' of 'Characters' objects>, '__doc__': None}
对象成员: {'name': '野原新之助', 'skills': '大象舞'}
name 野原新之助
skills 大象舞

7.__new__:

①定义:

  • __new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供
  • __new__不写的话默认是存在的,默认返回cls
  • __new__必须要有返回值,返回实例化出来的实例,没有返回值,__init__实例化方法不会被调用,可以return父类__new__出来的实例,或者直接是object__new__出来的实例
  • __init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值
  • 我们可以将类比作制造商,__new__方法就是前期的原材料购买环节,__init__方法就是在有原材料的基础上,加工、初始化商品的环节

②案例:

#定义魔法方法类
class MagicMethod():#定义初始化方法def __init__(self):print("我是初始化方法__init__")#定义new方法#没有返回值,init方法不被调用def __new__(cls, *args, **kwargs):print("我是new方法")#实例化
MagicMethod()#定义魔法方法类
class MagicMethod():#定义初始化方法def __init__(self):print("我是初始化方法__init__")#定义new方法#有返回值,把cls赋值给self,调用init方法def __new__(cls, *args, **kwargs):return object.__new__(cls)#实例化
MagicMethod()

8.__mro__:

①定义:在调用方法时,会对当前类以及所有的基类进行一个搜索,以确定该方法之所在,而这个搜索的顺序就是MRO

②搜索算法:Python2.3以后MRO的实现是基于C3算法

  • 本地优先级:指声明时父类的顺序,比如C(A,B),如果访问C类对象属性时,应该根据声明顺序,优先查找A类,然后再查找B类
  • 单调性:如果在C的解析顺序中,A排在B的前面,那么在C的所有子类里,也必须满足这个顺序

③案例:

#创建狗类(父类)
class Dogs():def __init__(self):self.sounds="汪汪汪"def animalSounds(self):print("修勾的叫声为%s"%self.sounds)def animalType(self):print("这是一只短腿柯基")
#创建猫类(父类)
class Cats():def __init__(self):self.sounds="喵喵喵"def animalSounds(self):print("修牟的叫声为%s"%self.sounds)def animalType(self):print("这是一只英短蓝猫")
#创建动物类(子类)
class Animal(Dogs,Cats):pass#创建子类实例
a=Animal()
#调用父类的属性
print(a.sounds)
#调用父类的方法
a.animalType()
#子类的魔法属性__mro__决定了属性和方法的查找顺序
print(Animal.__mro__)

9.__all__:

①定义:用于模块导入时限制

②特点:

  • 被导入模块若定义了__all__属性,则只有__all__内指定的属性、方法、类可被导入
  • 若没定义,则导入模块内的所有公有属性,方法和类
  • __all__可以导入私有方法和属性
  • __all__变量是一个由string元素组成的list变量,写成元组也可

③案例:

#创建all1.py
#指定被导入的类、方法和属性,私有化方法和属性也可导入
#__all__=("A","__func2","hello")
__all__=["A","__func2","hello"]
#创建A类
class A():#创建私有化属性_today='2022-04-18'def __init__(self,name,age):self.name=nameself.age=agedef get_today(self):return self._today
#创建B类
class B():def __init__(self,hobby,sex):self.hobby=hobbyself.sex=sex
#创建方法1
def func1():print("func1被导入")
#创建私有化方法2
def __func2():print("func2被导入")
#定义属性hello
hello="world"
#创建all2.py
#导入all1中的全部信息
from all1 import *#实例化对象
a=A("刘耀文",16)
print(a.name,a.age)
#获取私有化属性
print(a.get_today())
#获取私有化方法
__func2()
#获取属性
print(hello)

10.__call__():

①定义:

  • call()方法是Python中一个很特殊的方法。凡是可调用对象,都可以通过调用__call__()方法来调用该对象。如果类中定义了__call__()方法,那么该类的实例对象也将成为可调用对象。该对象被调用时,将执行__call__()方法中的代码。
  • Python中那些能够在后面加()来调用执行的对象,被称为可调用对象。可调用对象包括自定义函数、Python内置函数、实例对象和实例方法等。

 ②案例:

  • 调用自定义函数
#自定义函数
def callTest():print("Function callTest() is called")#调用自定义函数
print("Function test() is callable: %s" %callable(callTest))
#直接调用
callTest()
#通过__all__()调用
callTest.__call__()
  • 调用内置函数
#内置函数
myList=[22,33,99,11,55]#调用内置函数
print("Function test() is callable: %s" %callable(max))
#直接调用
print(max(myList))
#通过__all__()调用
print(max.__call__(myList))
  • 调用类的实例对象
  • 如果一个类中没有定义__call__()方法,那么这个类的实例对象是不可以被调用的
  • 如果类中定义了__call__()方法,那么这个类的实例对象是可以被调用的,调用该实例对象就是执行__call__()方法中的代码
#类的实例对象
class CallTest():pass#类的实例对象不可以被调用
c=CallTest()
print("Function test() is callable: %s" %callable(c))#类的实例对象
class CallTest():def __call__(self, *args, **kwargs):print("我是一个call方法,可以调用类的实例对象了")#类的实例对象可以被调用
c=CallTest()
print("Function test() is callable: %s" %callable(c))
#调用类的实例对象
c()

Python-面向对象1相关推荐

  1. python面向对象的优点_Python面向对象编程——总结面向对象的优点

    Python面向对象编程--总结面向对象的优点 一.从代码级别看面向对象 1.在没有学习类这个概念时,数据与功能是分离的 def exc1(host,port,db,charset): conn=co ...

  2. 这可能是Python面向对象编程的最佳实践

    作者 | 崔庆才 来源 | 进击的Coder(ID:FightingCoder) Python 是支持面向对象的,很多情况下使用面向对象编程会使得代码更加容易扩展,并且可维护性更高,但是如果你写的多了 ...

  3. 第八课.Python面向对象(二)

    类的继承和多态 继承和多态与函数有共同的目的,都是为了减少代码的冗余,提高复用的效率: 根据"Python面向对象(一)"的笔记,我现在定义一个Cinema类: #父类 class ...

  4. Python面向对象编程:类继承和其衍生术语

    Python面向对象编程03:类继承和其衍生术语 前面我们讲到过正则表达式字符等,上一篇分享了面向对象编程和类的结构,最后稍微提到了继承. Python面向对象编程:深度认识类class_ Pytho ...

  5. 《Python面向对象编程指南》——1.2 基类中的__init__()方法

    本节书摘来自异步社区<Python面向对象编程指南>一书中的第1章,第1.2节,作者[美]Steven F. Lott, 张心韬 兰亮 译,更多章节内容可以访问云栖社区"异步社区 ...

  6. Python 面向对象 基础

    编程范式概述: 面向过程 和 面向对象 以及函数式编程 面向过程:(Procedure Oriented)是一种以事件为中心的编程思想. 就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实 ...

  7. python面向对象类属性_python面向对象之类属性和类方法案例分析

    本文实例讲述了python面向对象之类属性和类方法.分享给大家供大家参考,具体如下: 目标 类的结构 类属性和实例属性 类方法和静态方法 01. 类的结构 1.1 术语 -- 实例 使用面相对象开发, ...

  8. 关于python面向对象编程中、下列说法中_关于Python面向对象编程的知识点总结

    前言 如果你以前没有接触过面向对象的编程语言,那你可能需要先了解一些面向对象语言的一些基本特征,在头脑里头形成一个基本的面向对象的概念,这样有助于你更容易的学习Python的面向对象编程. 接下来我们 ...

  9. python对象编程例子-这是我见过最详细的Python面向对象编程!建议收藏!

    原标题:这是我见过最详细的Python面向对象编程!建议收藏! 面向对象编程和函数式编程(面向过程编程)都是程序设计的方法,不过稍有区别. 面向过程编程: 1. 导入各种外部库 2. 设计各种全局变量 ...

  10. python面向对象编程的优点-Python面向对象编程——总结面向对象的优点

    Python面向对象编程--总结面向对象的优点 一.从代码级别看面向对象 1.在没有学习类这个概念时,数据与功能是分离的 def exc1(host,port,db,charset): conn=co ...

最新文章

  1. 使用Spring实现邮件发送
  2. AI在医疗行业的最新进展
  3. redis常用命令getex_Redis常用命令(key、string、List)
  4. Java模拟双色球彩票
  5. 设置Eclipse智能提示
  6. 电容的q值计算公式_在设计电路中电容容量大小、耐压等级选取详解 (转)
  7. 信安精品课:第2章网络攻击原理与常用方法精讲笔记
  8. ECSHOP 如何删除商品列表页 购买弹出 商品属性框后面的价格
  9. 使用 Multipath TCP 为 iOS 创建备份连接(转)
  10. Atitti v5住宿服务部后勤部建设指引指南.docx
  11. centos绑定多个ip CentOS一个网卡设置多个IP
  12. 如何搭建属于自己的网站博客?(手把手教你)
  13. C语言二维数组指针用法
  14. The xor-longest Path poj3764
  15. Matplotlib取代minitab绘制正态分布图
  16. LOCK is not allowed in stored procedures
  17. VS2017 和 Matlab R2016b 混合编程配置问题解决!
  18. 密码技术的典型应用——电子印章
  19. [分享]方便的 windbg 命令 - !list
  20. EXCEL网络共享解决方案

热门文章

  1. 湘潭校赛 Hard Wuxing
  2. Linux根目录下的内容
  3. 前端处理ios heic图片转jpg上传
  4. OpenCV:利用python-cv2绘制图形
  5. iconfont平台如何上传和下载字体图标
  6. std::string::npos是什么
  7. METHODS FOR NON-LINEAR LEAST SQUARES PROBLEMS 翻译(三)
  8. office套件_Microsoft Office 2019 for Mac(office办公套件)
  9. (附源码)计算机毕业设计SSM课堂考勤
  10. 实时渲染学习(四)纹理贴图及相关技术