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


Posted in Python onApril 02, 2019

简介

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

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

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

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

类使用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__)

运行结果

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

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

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

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

对象的方法

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

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

p = Person()
p.sayHi()

运行结果

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

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

去掉self

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

从报错中看出系统在调用这个类方法的时候默认给它传了一个参数,所以我们必须要有这个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()

运行结果

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

感觉效果不明显。。。

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()

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

这样就好啦。

类与对象的变量

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

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

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

一个很长的例子

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()

运行结果

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

像__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()

运行结果

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

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

小总结

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

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

Python 相关文章推荐
python中使用urllib2获取http请求状态码的代码例子
Jul 07 Python
Python greenlet实现原理和使用示例
Sep 24 Python
安装Python的web.py框架并从hello world开始编程
Apr 25 Python
Python实现利用163邮箱远程关电脑脚本
Feb 22 Python
python3利用Dlib19.7实现人脸68个特征点标定
Feb 26 Python
Python 实现数据结构-堆栈和队列的操作方法
Jul 17 Python
pandas 对group进行聚合的例子
Dec 27 Python
Python unittest基本使用方法代码实例
Jun 29 Python
python判断是空的实例分享
Jul 06 Python
基于Python pyecharts实现多种图例代码解析
Aug 10 Python
Python语言编写智力问答小游戏功能
Oct 13 Python
Python爬虫数据的分类及json数据使用小结
Mar 29 Python
Python参数解析模块sys、getopt、argparse使用与对比分析
Apr 02 #Python
python flask安装和命令详解
Apr 02 #Python
详解python 3.6 安装json 模块(simplejson)
Apr 02 #Python
Pyinstaller打包.py生成.exe的方法和报错总结
Apr 02 #Python
Python3字符串encode与decode的讲解
Apr 02 #Python
深入了解和应用Python 装饰器 @decorator
Apr 02 #Python
python使用Plotly绘图工具绘制散点图、线形图
Apr 02 #Python
You might like
PHP中SESSION使用中的一点经验总结
2012/03/30 PHP
PDO预处理语句PDOStatement对象使用总结
2014/11/20 PHP
PHP长网址与短网址的实现方法
2017/10/13 PHP
laravel 5.5 关闭token的3种实现方式
2019/10/24 PHP
理解JavaScript的变量的入门教程
2015/07/07 Javascript
Javascript类型系统之String字符串类型详解
2016/06/21 Javascript
手写简单的jQuery雪花飘落效果实例
2018/04/22 jQuery
解决vue 按钮多次点击重复提交数据问题
2018/05/10 Javascript
详解各版本React路由的跳转的方法
2018/05/10 Javascript
原生JS实现的简单轮播图功能【适合新手】
2018/08/17 Javascript
解决Vue.js由于延时显示了{{message}}引用界面的问题
2018/08/25 Javascript
jsonp跨域获取百度联想词的方法分析
2019/05/13 Javascript
返回上一个url并刷新界面的js代码
2020/09/12 Javascript
python进阶教程之动态类型详解
2014/08/30 Python
Python实现股市信息下载的方法
2015/06/15 Python
分析python请求数据
2018/08/19 Python
python scipy求解非线性方程的方法(fsolve/root)
2018/11/12 Python
Python time库基本使用方法分析
2019/12/13 Python
Python控制台实现交互式环境执行
2020/06/09 Python
在keras中对单一输入图像进行预测并返回预测结果操作
2020/07/09 Python
python 多线程共享全局变量的优劣
2020/09/24 Python
Pycharm 如何一键加引号的方法步骤
2021/02/05 Python
施华洛世奇美国官网:SWAROVSKI美国
2018/02/08 全球购物
可以使用抽象函数重写基类中的虚函数吗
2013/06/02 面试题
linux系统都有哪些运行级别
2012/04/15 面试题
工厂保安员岗位职责
2014/01/31 职场文书
美术教师岗位职责
2014/03/18 职场文书
法英专业大学生职业生涯规划书范文
2014/09/22 职场文书
村干部任职承诺书
2015/01/21 职场文书
孔繁森观后感
2015/06/10 职场文书
小学四年级班主任工作经验交流材料
2015/11/02 职场文书
python tqdm用法及实例详解
2021/06/16 Python
教你用Python+selenium搭建自动化测试环境
2021/06/18 Python
Python内置数据结构列表与元组示例详解
2021/08/04 Python
解决Git推送错误non-fast-forward的方法
2022/06/25 Servers
设置IIS Express并发数
2022/07/07 Servers