一、面向过程:是一种编程思想,核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么然后干什么,基于该编程思想写程序就好比在设计一条流水线,是一种机械式的思维方式

优点:把复杂问题流程化,进而简单化,降低开发难度

缺点:扩展性差

二、面向对象:也是一种编程思想,核心对象二字,对象就是特征与功能的结合体。基于该思想编写程序就好比是在创造一个世界,你就是这个世界的上帝,是一种上帝式的思维方式

优点:可扩展性强,对于程序员来说,不用再关心具体的步骤

缺点:编程复杂度高,得需要设计这些对象,要避免过度设计得问题,程序的可控性也很低,无法与流水线式的思想一样可以很精准的预测问题的处理流程与结果,面向对象的程序一旦开始就由对象之间的交互去解决问题,即便是上帝也无法预测最终结果

三、类与对象

类:具有相同特征和行为的一类事物(人、狗、猫等),是一个抽象的概念,不实际存在。类的作用是用于描述该类的对象具备什么样的特征和行为

其中表明事物特征的叫做属性(变量),表明事物的行为或功能的叫做方法(函数),属性和方法又叫做成员

对象:具体的某一事物,单个个体

类到对象的过程,叫做实例化,因而对象又可以称之为实例

四、初始化类和对象

在现实世界中,先有一个个具体存在的对象,然后随着人类文明的发展才出现了分类的概念,而在程序中,必须先定义类,然后通过类实例化产生对象

类的命名遵循变量的命名规范,一般使用驼峰命名法(由一个或者多个单词构成,每个单词首字母大写,单词跟单词直接相连)

类的定义

  1. class 类名():
  2. 类体

类体代码会在类定义阶段就立刻执行,会产生一个类的名称空间,对象的本质也是一个名称空间,对象名称空间是用来存放对象自己独有的属性,而类的名称空间中存放的是所有对象共有的属性,两个名称空间是独立存在的

类的两种作用:属性引用和实例化

属性引用:类本质就是一个名称空间,可以对该名称空间进行增删改查

实例化:调用类来产生对象(会做两件事)

  1、产生一个空对象

  2、触发类中 __init__方法

  1. class Person():
  2. country = 'China' # 类属性 —— 静态属性
  3.  
  4. # 这里的函数叫做方法 —— 动态属性
  5. def language(self): # 注意: self必须写
  6. print('someone say Chinese')
  7.  
  8. print(Person.country) # 查看类属性
  9. print(Person.language) # 查看类方法, 用类名去调用方法名, 打印出来的是内存地址

属性引用

  1. class Person():
  2. country = 'China'
  3.  
  4. def __init__(self, name, age):
  5. self.name = name
  6. self.age = age
  7.  
  8. def language(self):
  9. print('someone say Chinese')
  10.  
  11. # 实例化: 类名(参数1, 参数2) 类名加括号就等于在执行Person.__init__()
  12. qx = Person('qiuxi', 22)
  13. print(qx.name) # 对象名.属性名, 直接查看属性
  14. print(qx) # 返回的是一个对象
  15. qx.language() # 对象名.方法名(), 用来调用方法

实例化

对象的属性查找顺序:对象自己的名称空间 ---> 类的名称空间

五、关于 self

self 在对象的方法中表示当前对象本身,__init__ 称之为初始化函数,在创建对象时自动将对象本身传给 __init__ 的第一个参数

注意:

  def  __init__(self):   这句话可以写也可以不写,但只要有参数传进来的时候就必须得写

  def  方法名(self):这里的 self 必须得写

六、绑定方法

对象的绑定方法

首先我们明确一个知识点,凡是类中的方法或函数,默认情况下都是绑定给对象使用的。

  1. class People():
  2.  
  3. def __init__(self, name, age):
  4. self.name = name
  5. self.age = age
  6.  
  7. def talk(self):
  8. pass
  9.  
  10. p = People('qiu', 22)
  11. print(p.talk)
  12.  
  13. # 运行结果
  14. <bound method People.talk of <__main__.People object at 0x00000202267A8278>>

从上面的输出结果来看,talk() 这个类中的方法,是绑定给对象使用的,下面再看另一种情况

  1. class People():
  2. def __init__(self, name, age):
  3. self.name = name
  4. self.age = age
  5.  
  6. def talk():
  7. pass
  8.  
  9. p = People('qiu', 22)
  10. print(p.talk)
  11.  
  12. # 输出结果
  13. <bound method People.talk of <__main__.People object at 0x000002214E0C8278>>

现在,将 talk() 函数的参数去掉,结果显示与上面是一样。这说明,不管是类中的方法,还是类中函数,默认情况下都是绑定给对象使用的。绑定给对象使用有一种好处,那就是不用手动将对象传入,对象是自动传到类中。

  1. class People():
  2. def __init__(self, name, age):
  3. self.name = name
  4. self.age = age
  5.  
  6. def talk():
  7. pass
  8.  
  9. p = People('qiu', 22)
  10. print(People.talk)  # 类来调用类中的方法
  11. print(p.talk)
  12.  
  13. # 运行结果
  14. <function People.talk at 0x0000022BF5B19B70>
  15. <bound method People.talk of <__main__.People object at 0x0000022BF5B18278>>

上面的例子很好说明了,如果用类来调用类中的方法,那么这个方法仅仅只是一个函数,那么既然是函数,就不会有自动传值这一功能

  1. class People():
  2. def __init__(self, name, age):
  3. self.name = name
  4. self.age = age
  5.  
  6. def talk(self):
  7. pass
  8.  
  9. p = People('qiu', 22)
  10. People.talk() # 报错
  11. print(p.talk) # 正常
  12.  
  13. # 报错处
  14. TypeError: talk() missing 1 required positional argument: 'self'

从上面输出结果来看,当类调用类中的方法时候,是不会进行自动传值的,也就是说,函数有几个参数,我们就得传递进去几个参数。如果想结果正常运行,那么在类名调用 talk() 的时候,将参数一一都传递进去。即:

  1. People.talk(312312)

这个参数可以是任意的,但是,必须传递进去。而,当对象调用类中方法时候,则不用传递,如上面报错的下一行正常执行。既然知道了区别,那么,我们来看看下面代码:

  1. class People():
  2. def __init__(self, name, age):
  3. self.name = name
  4. self.age = age
  5.  
  6. def talk():
  7. pass
  8.  
  9. p = People('qiu', 22)
  10. People.talk() # 正常
  11. p.talk() # 报错
  12.  
  13. # 报错处
  14. TypeError: talk() takes 0 positional arguments but 1 was given

从输出结果来看,People 来调用 talk() 方法时候,并不需要传递参数;而当对象来调用 talk() 的时候,由于对象调用自己的绑定方法,会自动将对象当作第一个参数传递进去,所以,当类中 talk() 方法没有带参数时,而我又给它传递了一个,显然是会报错的。

综上所述:

  1、凡是类中的方法和函数,都是绑定给对象使用的

  2、绑定方法都有自动传值的功能,传递进去的值,就是对象本身

  3、如果类想调用绑定方法,就必须遵循函数的参数规则,有几个参数,就必须传递几个参数

既然类中的方法都是绑定给对象使用的,那么有没有方法是绑定给类使用的呢?答案是,当然有!但是现在不告诉你

Learning-Python【22】:面向对象初识的更多相关文章

  1. Python中面向对象初识到进阶

    面向对象初识到进阶 # 面向对象结构: # class 类名: # def __init__(self,参数1,参数2): # self.对象的属性1 = 参数1 # self.对象的属性2 = 参数 ...

  2. python之面向对象初识

    一.面向对象初识 1.结构上 面向对象分成两部分:属性.方法 class A: name = 'xiaoming' # 静态属性.静态变量.静态字段. def func1(self): # 函数.动态 ...

  3. 《Python》 面向对象初识

    一.面向对象初识: 1.结构上理解:类由两部分组成 class  A: # class是类的关键字,类名首字母默认大写 name = 'alex' # 静态属性,静态变量,静态字段 def  func ...

  4. 《Python》 面向对象初识(组合)

    一.面向对象(组合): 定义:给一个类的对象封装一个属性,这个属性是另一个类的对象. 意义:让类的对象与另一个类的对象产生关系,类与类之间产生关系. 人物使用武器攻击另一个人物: class Game ...

  5. Python基础-面向对象初识--类

    什么是类 具有相似功能和属性的一类实物 什么是对象 类的具体体现,具体到一个 面向对象的优势 1.类是一组相似功能的集合,使组织结构更加清晰和规范化 2.研究面向对象要有上帝的思维,用面向对象设计程序 ...

  6. python递归 及 面向对象初识及编程思想

    递归 及 面向对象初识及编程思想   一.递归 1.定义: 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. (1)递归就是在过程或函数里调用自身: (2)在使用递 ...

  7. python全栈开发 * 22 面向对象 知识点汇总 * 180703

    22 面向对象 -----属性,类方法,静态方法,反射一.属性1.属性的定义:将方法伪装成属性,虽然在代码层面上没有任何高深之处,但让其看起来更合理. (类似于属性的方法)class Person: ...

  8. python基础学习笔记——面向对象初识

    面向对象初识 python中一切皆对象. 类有两种: 新式类:在py3中所有类都是新式类 经典类:在py2中只有类本身继承了object类才叫做新式类,默认是经典类 class Person: cou ...

  9. Python 入门 之 初识面向对象

    Python 入门 之 初识面向对象 1.初识面向对象编程 (核心--对象) (1)观察以下代码: # 面向过程编程 s = "alexdsb" count = 0 for i i ...

  10. Python面向对象01 /面向对象初识、面向对象结构、类、self、实例化对象

    Python面向对象01 /面向对象初识.面向对象结构.类.self.实例化对象 目录 Python面向对象01 /面向对象初识.面向对象结构.类.self.实例化对象 1. 面向对象初识 2. 面向 ...

随机推荐

  1. Linux 下挂载新硬盘方法

    Linux的硬盘识别: 一般使用”fdisk -l”命令可以列出系统中当前连接的硬盘 设备和分区信息.新硬盘没有分区信息,则只显示硬盘大小信息.   1.关闭服务器加上新硬盘   2.启动服务器,以r ...

  2. Centos7 修改系统时区timezone

    Centos7 修改系统时区timezone 注意:修改Linux系统的时区以后,再安装jvm,jvm默认会使用系统的时区.如果系统时区设置错误,安装jvm后,再修改系统的时区,但jvm的时区仍然用不 ...

  3. 泡泡一分钟:Semantic Labeling of Indoor Environments from 3D RGB Maps

    张宁 Semantic Labeling of Indoor Environments from 3D RGB Maps Manuel Brucker,  Maximilian Durner,  Ra ...

  4. Consul的应用

    Consul在集群上的每一个节点(包括Server和Client)都运行一个Agent,通过这个Agent可以进行对Consul所提供的功能的操作,通过调用一系列HTTP API与Agent的交互即可 ...

  5. AndrewNG Deep learning课程笔记 - CNN

    参考, An Intuitive Explanation of Convolutional Neural Networks http://www.hackcv.com/index.php/archiv ...

  6. C++11 使用异步编程std::async和std::future

    先说明一点:std::asyanc是std::future的高级封装, 一般我们不会直接使用std::futrue,而是使用对std::future的高级封装std::async. 下面分别说一下. ...

  7. SpringCloud微服务高级

    分布式配置中心 什么是配置中心 在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件.在Spring Cloud中,有分布式配置中心组件spring c ...

  8. 【JVM】-NO.115.JVM.1 -【JDK11 HashMap详解-4-伸展树、B树】

    .Style:Mac Series:Java Since:2018-09-10 End:2018-09-10 Total Hours:1 Degree Of Diffculty:5 Degree Of ...

  9. 求职季全攻略:优秀的UX设计师作品集该如何准备?

    这是一篇关于如何制作杰出的UX设计师作品集,看了下文,我们在2019年冲冲冲~制作出自己的作品集! 转自墨刀公众号. Paul Rand 曾经说:“设计很简单,因而也复杂.” 也许你已经掌握了所有的U ...

  10. InternalError (see above for traceback): Blas GEMM launch failed

    训练BiLSTM模型的时候报错: InternalError (see above for traceback): Blas GEMM launch failed : a.shape=(32, 200 ...