从0开始的Python学习014面向对象编程(推荐)

简介

到目前为止,我们的编程都是根据数据的函数和语句块来设计的,面向过程的编程。还有一种我们将数据和功能结合起来使用对象的形式,使用它里面的数据和方法这种方法叫做面向对象的编程。

类和对象是面向对象编程的两个重要方面。对于类和对象的关系,举个例子就像学生和小明同学的关系一样。学生(类)是一个拥有共同属性的群体,小明同学(对象)是其中一个有自己特性的个体。

对于一个对象或类的变量被称为域,函数被称为类或对象的方法。

域有两种类型--属于每个对象或属于类本身,分别成为实例变量和类变量。

类使用class关键字创建,类的域和方法被列在一个缩进块中。

self

类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称,但是在调用这个方法的时候你不为这个参数赋值,Python会提供这个值。这个特别的变量指对象本身,按照惯例它的名称是self。

虽然你可以给这个参数任何名称,但是 强烈建议 你使用self这个名称——其他名称都是不赞成你使用的。使用一个标准的名称有很多优点——你的程序可以迅速识别它,如果使用self的话,还有些IDE(集成开发环境)也可以帮助你。

给C++/Java/C#程序员的注释
Python中的self等价于C++中的self指针和Java、C#中的this参考。

你一定很奇怪Python如何给self赋值以及为何你不需要给它赋值。举一个例子会使此变得清晰。假如你有一个类称为MyClass和这个类的一个实例MyObject。当你调用这个对象的方法MyObject.method(arg1, arg2)的时候,这会由Python自动转为MyClass.method(MyObject, arg1, arg2)——这就是self的原理了。

这也意味着如果你有一个不需要参数的方法,你还是得给这个方法定义一个self参数

(这个概念好长啊。。。。。。)

class 类名():
    代码块

'''the first class
  from liu
  我们使用class语句后跟类名,创建了一个新的类。这后面跟着一个缩进的语句块形成类体。在这个例子中,我们使用了一个空白块,它由pass语句表示。

接下来,我们使用类名后跟一对圆括号来创建一个对象/实例。(我们将在下面的章节中学习更多的如何创建实例的方法)。为了验证,我们简单地打印了这个变量的类型。它告诉我们我们已经在__main__模块中有了一个Person类的实例。

可以注意到存储对象的计算机内存地址也打印了出来。这个地址在你的计算机上会是另外一个值,因为Python可以在任何空位存储对象。
  '''
class Person:
  pass # 空块 

p = Person()
print (p)
print(__doc__)

运行结果

我们使用class语句后跟类名,创建了一个新的类。这后面跟着一个缩进的语句块形成类体。在这个例子中,我们使用了一个空白块,它由pass语句表示。

接下来,我们使用类名后跟一对圆括号来创建一个对象/实例。为了验证,我们简单地打印了这个变量的类型。它告诉我们我们已经在__main__模块中有了一个Person类的实例。

可以注意到存储对象的计算机内存地址也打印了出来。这个地址在你的计算机上会是另外一个值,因为Python可以在任何空位存储对象。

对象的方法

对象的方法其实就是一个函数,只不过在这个函数会有一个特别的参数self。

class Person:
  def sayHi(self):
    print('Hello,how are you?')

p = Person()
p.sayHi()

运行结果

这个self感觉不到它的作用,但是还是要在参数中定义这是为什么呢?

去掉self

从报错中看出系统在调用这个类方法的时候默认给它传了一个参数,所以我们必须要有这个self,不为别的,因为报错。。。。。。

__init__方法

init是一个初始化块,在对象被建立的同时运行这个代码块,为你的对象初始化。需要注意的是名称的开始和结尾都要有两个下划线。

'''__init__方法
  __init__一个对象被建立的时候,马上运行。这个方法是对你的对象的初始化。
  这个名称的开始和结尾都是双下划线。'''

class Person:
  def __init__(self,name):
    self.name = name

  def sayHi(self):
    print('Hello,my name is ',self.name)

p = Person('happyLiu')
p.sayHi()

运行结果

感觉效果不明显。。。

class Person:
  def __init__(self,name):
    print('这是初始化块')
    self.name = name

  def sayHi(self):
    print('Hello,my name is ',self.name)

p = Person('happyLiu')
p.sayHi()

这样就好啦。

类与对象的变量

类的变量 由一个类的所有对象(实例)共享使用。

对象的变量 由类的每个对象/实例拥有。

可以理解为类的变量是这个类下所有对象公用的,而对象的变量是这个对象私有的。

一个很长的例子

class Person:
  population = 0

  def __init__(self,name):
    self.name = name
    print('Initalizing %s' % self.name)

    Person.population += 1

  def __del__(self):
    print('%s says bye.' % self.name)

    Person.population -= 1

    if Person.population == 0:
      print('I am the last one.')
    else:
      print('There are still %d people left.' % Person.population)

  def sayHi(self):
    print('Hi, my name is %s.' % self.name)

  def howMany(self):
    if Person.population == 1:
      print('I am the only person here.')
    else:
      print('We have %d persons here.' % Person.population)

happy = Person('happyLiu')
happy.sayHi()
happy.howMany()

bob = Person('bob james')
bob.sayHi()
bob.howMany()

del bob

happy.sayHi()
happy.howMany()

运行结果

像__init__方法一样,还有一个特殊的方法__del__,它在对象消逝的时候被调用。对象消逝即对象不再被使用,它所占用的内存将返回给系统作它用。

使用不同的对象的时候,就会调用类的方法,但是传的参数是这个对象自己的,所以我们面向对象的编程是非常灵活的。

继承

class 子类(父类):
    代码块

面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过 继承 机制。继承完全可以理解成类之间的 类型和子类型 关系。

人是父类,男人是子类,小明是对象(小明没有对象,(¬︿̫̿¬☆))。

一个子类型在任何需要父类型的场合可以被替换成父类型,即对象可以被视作是父类的实例,这种现象被称为多态现象。

另外,我们会发现在 重用 父类的代码的时候,我们无需在不同的类中重复它。而如果我们使用独立的类的话,我们就不得不这么做了。

举个栗子

class SchoolMember:
  '''Represents any school member.'''
  def __init__(self,name,age):
    self.name = name
    self.age = age
    print('(Initialized SchoolMember: %s)'%self.name)

  def tell(self):
    '''Tell my details.'''
    print('Name:%s Age:%d'%(self.name,self.age))

class Teacher(SchoolMember):
  '''Represents a teacher.'''
  def __init__(self,name,age,salary):
    SchoolMember.__init__(self,name,age)
    self.salary = salary
    print('(Initialized Teacher: %s)' % self.name)

  def tell(self):
    SchoolMember.tell(self)
    print('Salary:"%d"' % self.salary)

class Student(SchoolMember):
  '''Represents a student.'''
  def __init__(self, name, age, marks):
    SchoolMember.__init__(self,name,age)
    self.marks = marks
    print('(Initialized Student: %s)' % self.name)

  def tell(self):
    SchoolMember.tell(self)
    print('Marks: "%d"'%self.marks)

t = Teacher('Mr,Liu',25,3000)
s = Student('Swaroop', 22, 75)

print()

members = [t,s]
for member in members:
  member.tell()

运行结果

为了使用继承,我们把基本类的名称作为一个元组跟在定义类时的类名称之后。然后,我们注意到基本类的__init__方法专门使用self变量调用,这样我们就可以初始化对象的基本类部分。这一点十分重要——Python不会自动调用基本类的constructor,你得亲自专门调用它,SchoolMember.__init__(self,name,age)就是它,开始的时候无限报错的就是它。

小总结

我们已经研究了类和对象的多个内容以及与它们相关的多个术语。通过本章,你已经了解了面向对象的编程的优点和缺陷。Python是一个高度面向对象的语言,理解这些概念会在将来有助于你进一步深入学习Python。

以上所述是小编给大家介绍的Python面向对象编程详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • Python简直是万能的,这5大主要用途你一定要知道!(推荐)

    从2015开始国内就开始慢慢接触Python了,从16年开始Python就已经在国内的热度更高了,目前也可以算的上"全民Python"了. 众所周知小学生的教材里面已经有Python了,国家二级计算机证也需要学习Python了! 因为Python简单.入门快,是不少程序员入门的首选语言. 如果你想学Python,或者你刚开始学习Python,那么你可能会问:"我能用Python做什么?" 这个问题不好回答,因为Python有很多用途. 但是随着时间,我发现有Pyth

  • Python3获取拉勾网招聘信息的方法实例

    前言 为了了解跟python数据分析有关行业的信息,大概地了解一下对这个行业的要求以及薪资状况,我决定从网上获取信息并进行分析.既然想要分析就必须要有数据,于是我选择了拉勾,冒着危险深入内部,从他们那里得到了信息.不得不说,拉勾的反爬技术还挺厉害的,稍后再说明.话不多说,直接开始. 一.明确目的 每次爬虫都要有明确的目的,刚接触随便找东西试水的除外.我想要知道的是python数据分析的要求以及薪资状况,因此,薪资.学历.工作经验以及一些任职要求就是我的目的. 既然明确了目的,我们就要看一下它们在

  • Python3实现计算两个数组的交集算法示例

    本文实例讲述了Python3实现计算两个数组的交集算法.分享给大家供大家参考,具体如下: 问题: 给定两个数组,写一个方法来计算它们的交集. 方案一:利用collections.Counter的&运算,一步到位,找到 最小次数 的相同元素. # -*- coding:utf-8 -*- #! python3 def intersect(nums1, nums2): """ :type nums1: List[int] :type nums2: List[int] :r

  • Python时间序列处理之ARIMA模型的使用讲解

    ARIMA模型 ARIMA模型的全称是自回归移动平均模型,是用来预测时间序列的一种常用的统计模型,一般记作ARIMA(p,d,q). ARIMA的适应情况 ARIMA模型相对来说比较简单易用.在应用ARIMA模型时,要保证以下几点: 时间序列数据是相对稳定的,总体基本不存在一定的上升或者下降趋势,如果不稳定可以通过差分的方式来使其变稳定. 非线性关系处理不好,只能处理线性关系 判断时序数据稳定 基本判断方法:稳定的数据,总体上是没有上升和下降的趋势的,是没有周期性的,方差趋向于一个稳定的值. A

  • Python代码实现删除一个list里面重复元素的方法

    网上学习了的两个新方法,代码非常之简洁.看来,不是只要实现了基本功能就能交差滴,想要真的学好python还有很长的一段路呀 方法一:是利用map的fromkeys来自动过滤重复值,map是基于hash的,大数组的时候应该会比排序快点吧 方法二:是用set(),set是定义集合的,无序,非重复 方法三:是排序后,倒着扫描,遇到已有的元素删之 #!/usr/bin/python #coding=utf-8 ''' Created on 2012-2-22 Q: 给定一个列表,去掉其重复的元素,并输出

  • Python3实现的旋转矩阵图像算法示例

    本文实例讲述了Python3实现的旋转矩阵图像算法.分享给大家供大家参考,具体如下: 问题: 给定一个 n × n 的二维矩阵表示一个图像. 将图像顺时针旋转 90 度. 方案一:先按X轴对称旋转, 再用zip()解压,最后用list重组. # -*- coding:utf-8 -*- #! python3 class Solution: def rotate(self, matrix): """ :type matrix: List[List[int]] :rtype: v

  • python3对拉勾数据进行可视化分析的方法详解

    前言 上回说到我们如何把拉勾的数据抓取下来的,既然获取了数据,就别放着不动,把它拿出来分析一下,看看这些数据里面都包含了什么信息. (本次博客源码地址:https://github.com/MaxLyu/Lagou_Analyze (本地下载)) 下面话不多说了,来一起看看详细的介绍吧 一.前期准备 由于上次抓的数据里面包含有 ID 这样的信息,我们需要将它去掉,并且查看描述性统计,确认是否存在异常值或者确实值. read_file = "analyst.csv" # 读取文件获得数据

  • Python3安装Pillow与PIL的方法

    关于Pillow与PIL PIL(Python Imaging Library)是Python一个强大方便的图像处理库,名气也比较大.不过只支持到Python 2.7. PIL官方网站:http://www.pythonware.com/products/pil/ Pillow是PIL的一个派生分支,但如今已经发展成为比PIL本身更具活力的图像处理库.目前最新版本是3.0.0. Pillow的Github主页:https://github.com/python-pillow/Pillow Pil

  • python2.7使用plotly绘制本地散点图和折线图

    本人在学习使用Python和plotly处理数据时,经过两个小时艰难试错,终于完成了散点图和折线图的实例.在使用过程中遇到一个大坑,因为官方给出的案例是用在线存储的,所以需要安装jupyter(也就是ipython)才能使用notebook来处理生成的文件,一开始我没太懂iplot和plot之间的差异,导致浪费了很多时间. 重要提示:最新的jupyter不支持Python3.2及以下版本. 最后我只能继续采用本地文件的形式来解决这个问题了.下面放出我的测试代码,被注释掉的是官方给出的代码以及离线

  • Python参数解析模块sys、getopt、argparse使用与对比分析

    一些命令行工具的使用能够大大简化代码脚本的维护成本,提升复用性,今天主要是借助于python提供的几种主流的参数解析工具来实现简单的功能,主要是学习实践为主,这是新年伊始开工的第一篇,还是花了一番功夫来完成写作的和实验的,希望能够帮到需要的朋友们,新的一年里,祝大家心想事成! 好了,废话不多说,下面进入正文. Python中有三个内建的模块用于处理命令行参数: 第一个:sys,最简单,只能够提供简单的参数解析功能 第二个:getopt,只能简单的处理命令行参数 ,较sys封装更好一点 第三个:a

随机推荐