Python不仅支持面向过程编程,同时也支持面向对象编程。面向过程就是分析解决问题所需的步骤,然后用函数把这些步骤逐一实现,使用的时候再一个个调用函数就可以。面向对象则是把解决的问题按照一定规则划分为多个独立的对象,然后通过调用对象的方法来解决问题。在编写小程序(少于500行代码)时,使用面向过程编程基本上不会有任何问题。但对于中等和大型项目来说,面向对象将给代码的编写和维护带来很多优势。本文主要介绍Python中面向对象的基本概念。

面向对象基本概念

面向对象的特点主要可以概括为封装性、继承性、多态性。

(1)封装性

封装是面向对象的核心思想,将对象的属性和行为封装起来,不需要让外界知道具体实现细节,这就是封装的思想。比如,用户使用电脑,只需要会敲键盘就可以,无须知道电脑内部是如何工作的。

(2)继承性

继承性主要描述的是类与类之间的关系,通过继承,可以在无须重新编写原有类的情况下,对原有类的功能进行扩展。

(3)多态性

多态性指的是在程序中允许重名现象,它指在一个类中定义的属性和方法被其他类继承后,它们可以具有不同的数据类型或表现出不同的行为,这使得同一个属性和方法在不同的类中具有不同的语义。

面向对象的思想需要通过大量的实践去学习和理解,才能将面向对象真正理解清楚。后面会通过一些例子介绍其使用方法。

类和对象基本概念

面向对象的思想中提出了两个概念,即类和对象。类是对某一类事物的抽象描述,是一种抽象的数据类型,一种模板。而对象用于表示现实中该类事物的个体,也就是具体化了类的描述。它们的关系是,对象是类的具体实例,类是对象的模板。对象根据类创建,一个类可以创建多个对象。比如我定义了一个学生类,那么通过类创建出来的小明、小王就叫对象。

类的定义

在Python中使用class关键字定义一个类,类的主体由属性(变量)和方法(函数)组成。通过定义一个学生类来学习下Python类的定义方法,如下:

#-*- coding:utf-8 -*-

#类的创建
class Student(object):
count = 0 #类属性 def __init__(self, name, age): #__init__为类的构造函数
self.name = name #实例属性
self.age = age #实例属性 def output(self): #实例方法
print self.name
print self.age

上述例子中Student是类名,__init__()函数是构造函数,count、name、age是类中定义的属性,output(self)是类中定义的方法。

对象的创建和使用

定义完Student类之后,就可以创建对象。当一个对象被创建后,包含3个方面的特性:对象的句柄、属性和方法。对象的句柄用于区分不同的对象,当对象被创建后,该对象会获取一块存储空间,存储空间的地址即为对象的标识。Python创建对象的方法是通过类名加圆括号的方式。实例化上述定义的Student类,格式如下:

#-*- coding:utf-8 -*-

#类的创建
class Student(object):
count = 0 #类属性 def __init__(self, name, age): #__init__为类的构造函数
self.name = name #实例属性
self.age = age #实例属性 def output(self): #实例方法
print self.name
print self.age if __name__ == '__main__':
stu1 = Student('Zhangsan',18) #使用Student类对象stu1
print "stu1.name = %s" % (stu1.name,) # 利用对象stu1获取对象属性name。输出stu1.name = Zhangsan
print "stu1.age = %d" % (stu1.age,) # 利用对象stu1获取对象属性age。输出stu1.age = 18
stu1.output() # 利用对象stu1调用output方法。

实例化对象之后,就可以通过对象直接调用对象的属性和方法。但是注意的是对象调用方法时,不需要给参数self赋值,self参数用于表示指向实例对象本身。

到这里,已经学会了类的定义和对象创建方法和使用了。上述的例子中仅介绍了类的基本实例属性和实例方法的定义,实际上实例变量还区分私有属性和公有属性,还有类变量等概念。同时类中的方法还包括静态方法、类方法。

类属性和实例属性

类的属性是对数据的封装,类中定义的属性包括实例属性、类属性两种。上述例子中count变量属于类属性,name、age属于实例属性。类变量可以在该类的所有实例中被共享。二者在定义和使用上区别主要如下:

(1)类属性定义在类中但是在方法外的变量,实例属性通常定义在构造函数__init__内。如下

class Student(object):
count = 0 #类属性 def __init__(self, name, age): #__init__为类的构造函数
self.name = name #实例属性
self.age = age #实例属性

(2)类属性属于类本身,可以通过类名进行访问/修改。

#-*- coding:utf-8 -*-

#类的创建
class Student(object):
count = 0 #类属性 if __name__ == '__main__':
Student.count = 100
print "Student.count = %d" % (Student.count,) #输出Student.count = 100

(3)类属性也可以被类的所有实例访问/修改。

#-*- coding:utf-8 -*-

#类的创建
class Student(object):
count = 0 #类属性 def __init__(self, name, age): #__init__为类的构造函数
self.name = name #实例属性
self.age = age #实例属性 if __name__ == '__main__':
stu1 = Student('Zhangsan',18) #使用Student类对象stu1
stu1.count = 100
print "stu1.count = %s" % (stu1.count,) # 利用对象stu1获取类属性count值。输出stu1.count = 100

(4)实例属性只能通过实例访问。

#-*- coding:utf-8 -*-

#类的创建
class Student(object):
count = 0 #类属性 def __init__(self, name, age): #__init__为类的构造函数
self.name = name #实例属性
self.age = age #实例属性 if __name__ == '__main__':
stu1 = Student('Zhangsan',18) #使用Student类对象stu1
print "stu1.age = %d" % (stu1.age,) # 利用对象stu1获取实例属性age值。输出stu1.age = 18
#print "Student.age = %d" % (Student.age,) # 报错,不能通过类直接访问实例属性

(5)当类属性与实例属性名称相同时,一个实例访问这个属性时实例属性会覆盖类属性,但类访问时不会。

#-*- coding:utf-8 -*-

#类的创建
class Student(object):
name = "Xiaoming" #类属性 def __init__(self, name, age): #__init__为类的构造函数
self.name = name #实例属性
self.age = age #实例属性 if __name__ == '__main__':
stu1 = Student('Zhangsan',18) #使用Student类对象stu1
print "stu1.name = %s" % (stu1.name,) # 输出Zhangsan
print "Student.name = %s" % (Student.name,) # 输出Xiaoming

实例方法、类方法和静态方法

自定义的一个类中,可能出现三种方法,实例方法、静态方法和类方法,下面来看下三种方法的定义和使用区别。

(1)实例方法

实例方法的第一个参数必须是"self",实例方法只能通过对象调用。

#-*- coding:utf-8 -*-

#类的创建
class Student(object):
count = 0 #类属性 def __init__(self, name, age): #__init__为类的构造函数
self.name = name #实例属性
self.age = age #实例属性 def output(self): #实例方法
print self.name, self.age if __name__ == '__main__':
stu1 = Student('Zhangsan',18) #使用Student类对象stu1
stu1.output() # 利用对象stu1调用output方法。

其中output()方法即为实例方法,必须带一个参数self,调用时不必给该参数赋值。

(2)类方法

类方法是将类本身作为操作对象的方法。类方法可以使用函数classmethod()或@classmethod修饰器定义。与实例方法不同的是,把类作为第一个参数(cls)传递。类方法可以通过类名调用,也可以通过对象调用。代码如下:

#-*- coding:utf-8 -*-

#类的创建
class Student(object):
count = 0 #类属性 def __init__(self, name, age): #__init__为类的构造函数
self.name = name #实例属性
self.age = age #实例属性 @classmethod #方法一,定义类方法,调用类变量,getPrice中不带self参数
def getCount(cls):
print cls.count def getCount2(cls):
print cls.count
tran_getCount2 = classmethod(getCount2) ##方法二,定义类方法,调用类变量 if __name__ == '__main__':
Student.getCount() #使用类名直接调用类方法
stu1 = Student('Zhangsan',18) #使用Student类对象stu1
stu1.getCount() # 利用对象stu1调用类方法。

可见,类方法的使用和静态方法十分相似。如果某个方法需要被其他实例共享,同时又需要使用当前实例的属性,则定义为类方法。

(3)静态方法

静态方法使用函数classmethod()或@classmethod修饰器定义。定义和使用方式如下:

#-*- coding:utf-8 -*-

#类的创建
class Student(object):
count = 0 #类属性 def __init__(self, name, age): #__init__为类的构造函数
self.name = name #实例属性
self.age = age #实例属性 @staticmethod #方法一,定义类方法,调用类变量,getPrice中不带self参数
def getCount():
print Student.count def getCount2():
print Student.count
tran_getCount2 = staticmethod(getCount2) ##方法二,定义类方法,调用类变量 if __name__ == '__main__':
Student.getCount() #使用类名直接调用静态方法
stu1 = Student('Zhangsan',18) #使用Student类对象stu1
stu1.getCount() # 利用对象stu1调用静态方法。

这三种方法的主要区别在于参数,实例方法被绑定到一个实例,只能通过实例进行调用;但是对于静态方法和类方法,可以通过类名和对象两种方式进行调用。

小结

本文介绍了Python面向对象基本概念、类的定义、对象的创建和使用、类的属性和方法。了解这些基本概念,有助于后续的实际开发。

Python面向对象编程(上)的更多相关文章

  1. python面向对象编程(上)

    面向对象编程(OOP,Object Oriented Programming)是每一个高级编程语言都支持的编程方法,比如JAVA/C++/C#等等.学习面向对象编程是每一个程序员都绕不开的重点内容. ...

  2. python 面向对象编程学习

    1. 问题:将所有代码放入一个py文件:无法维护 方案:如果将代码才分放到多个py文件,好处: 1. 同一个名字的变量互相不影响 2.易于维护 3.引用模块: import module 2.包:解决 ...

  3. python面向对象编程进阶

    python面向对象编程进阶 一.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 ...

  4. Python面向对象编程(下)

    本文主要通过几个实例介绍Python面向对象编程中的封装.继承.多态三大特性. 封装性 我们还是继续来看下上文中的例子,使用Student类创建一个对象,并修改对象的属性.代码如下: #-*- cod ...

  5. Python面向对象编程——继承与派生

    Python面向对象编程--继承与派生 一.初始继承 1.什么是继承 继承指的是类与类之间的关系,是一种什么"是"什么的关系,继承的功能之一就是用来解决代码重用问题. 继承是一种创 ...

  6. 图解python | 面向对象编程

    作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/56 本文地址:http://www.showmeai.tech/article-det ...

  7. python 面向对象编程(一)

    一.如何定义一个类 在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法. 类是对现实世界中一些事物的封装,定义一个类可以采用下面的方式来定义: class c ...

  8. Python面向对象编程指南

    Python面向对象编程指南(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1SbD4gum4yGcUruH9icTPCQ 提取码:fzk5 复制这段内容后打开百度网 ...

  9. Python 面向对象编程——访问限制

    <无访问限制的对象> 在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑.但是,从前面Student类的定义来看(见:Py ...

  10. Python 面向对象编程 继承 和多态

    Python 面向对象编程 继承 和多态 一:多继承性 对于java我们熟悉的是一个类只能继承一个父类:但是对于C++ 一个子类可以有多个父亲,同样对于 Python一个类也可以有多个父亲 格式: c ...

随机推荐

  1. c#的默认访问权限

    1.命名空间下的元素的默认访问修饰符 public : 同一程序集的其他任何代码或引用该程序集的其他程序集都可以访问该类型或成员. internal : 同一程序集中的任何代码都可以访问该类型或成员, ...

  2. oracle 查看字段说明

    SELECT    *FROM    all_col_commentsWHERE    table_name = UPPER ('t_bn_background')AND OWNER = 'VTER' ...

  3. ip本地查询

    下载地址:http://www.cz88.net/ http://www.crsky.com/soft/2611.html QQWry.dat文件在结构上分为3块:文件头,记录区,索引区. 一般我们要 ...

  4. 云南-第一个应用节点-ssh登录-卡顿的问题

    云南电信,从管理节点ssh连接到第一个应用节点,出现延迟卡顿的问题,解决方法:   systemctl restart systemd-logind.service   附: 操作系统类型: SLES ...

  5. python3 基础整理

    基础语法 1.python中区分大小写 2.查看关键字用 import keyword print (keyword.kwlist) 3.注释 #  单行注释,多行注释的快捷键是ctr+/,取消注释的 ...

  6. UVa699

    这个建树的根选的很有意思,在中间作为树的根.所以二叉树建树的方法虽然一般是有两种数组的方法,一个是如果深度不太大的话,可以之间用2*k+1,2*k建树,如果很大的话,就挨着建树,弄一个结构体,有左右子 ...

  7. alpha冲刺(4/10)

    前言 队名:旅法师 作业链接 队长博客 燃尽图 会议 会议照片 会议内容 陈晓彬(组长) 今日进展: 召开会议 安排任务 博客撰写 问题困扰: pm和程序猿的交流到底应该怎么样呢,会出现,不做安排的任 ...

  8. PC timeline

    https://news.microsoft.com/facts-about-microsoft/ 日期 事件               1975年 微软成立               1981年 ...

  9. ssh登录原理及免密登录方法

    免密登录设置 1.进入到我的home目录  cd ~/.ssh 2.生成ssh免登陆秘钥ssh-keygen -t rsa (四个回车)      执行完这个命令后,会生成两个文件id_rsa(私钥) ...

  10. angularjs 的模型无法绑定到隐藏域(input hidden)

    描述一下问题: 在操作表单中的隐藏域的时候发现angularjs的模型无法绑定,比如: <input type="hidden" name="someData&qu ...