Python面向对象编程(上)
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面向对象编程(上)的更多相关文章
- python面向对象编程(上)
面向对象编程(OOP,Object Oriented Programming)是每一个高级编程语言都支持的编程方法,比如JAVA/C++/C#等等.学习面向对象编程是每一个程序员都绕不开的重点内容. ...
- python 面向对象编程学习
1. 问题:将所有代码放入一个py文件:无法维护 方案:如果将代码才分放到多个py文件,好处: 1. 同一个名字的变量互相不影响 2.易于维护 3.引用模块: import module 2.包:解决 ...
- python面向对象编程进阶
python面向对象编程进阶 一.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 ...
- Python面向对象编程(下)
本文主要通过几个实例介绍Python面向对象编程中的封装.继承.多态三大特性. 封装性 我们还是继续来看下上文中的例子,使用Student类创建一个对象,并修改对象的属性.代码如下: #-*- cod ...
- Python面向对象编程——继承与派生
Python面向对象编程--继承与派生 一.初始继承 1.什么是继承 继承指的是类与类之间的关系,是一种什么"是"什么的关系,继承的功能之一就是用来解决代码重用问题. 继承是一种创 ...
- 图解python | 面向对象编程
作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/56 本文地址:http://www.showmeai.tech/article-det ...
- python 面向对象编程(一)
一.如何定义一个类 在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法. 类是对现实世界中一些事物的封装,定义一个类可以采用下面的方式来定义: class c ...
- Python面向对象编程指南
Python面向对象编程指南(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1SbD4gum4yGcUruH9icTPCQ 提取码:fzk5 复制这段内容后打开百度网 ...
- Python 面向对象编程——访问限制
<无访问限制的对象> 在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑.但是,从前面Student类的定义来看(见:Py ...
- Python 面向对象编程 继承 和多态
Python 面向对象编程 继承 和多态 一:多继承性 对于java我们熟悉的是一个类只能继承一个父类:但是对于C++ 一个子类可以有多个父亲,同样对于 Python一个类也可以有多个父亲 格式: c ...
随机推荐
- git不添加.idea等IDE配置文件夹
git不添加.idea等IDE配置文件夹由于.idea(intellJ,pycharm)的IDE文件夹很常出现,建议将gitignore设置为全局. git config --global core. ...
- 莫烦tensorflow(5)-训练二次函数模型并用matplotlib可视化
import tensorflow as tfimport numpy as npimport matplotlib.pyplot as plt def add_layer(inputs,in_siz ...
- 本地maven库导入架包
mvn install:install-file -DgroupId=com.alipay -DartifactId=sdk-java -Dversion=20170725114550 -Dpacka ...
- centOS连接没问题,使用SecureCRT就不能连接
原因: 将NAT模式改为自定义的模式即可:
- Concordion test
reference documents http://concordion.org/Example.html
- PythonStudy——字典的定义 Dictionary definition
# 空字典 d1 = {} d2 = dict() # 用map映射创建字典 d3 = dict({'a': 1, 'b': 1}) print(d3) # 用关键字赋值方式 d4 = dict(na ...
- linux(centos6.9)安装步骤
http://blog.csdn.net/u012453843/article/details/52819756 https://mirrors.aliyun.com/ 下载想要的版本 2选择新建虚拟 ...
- 【java】static用法
static作用: 用来修饰函数成员,成员变量和成员函数.类对象的属性都一致且能共享,比如国籍,这就能用static修饰,name不能共享,因为每个人都有自己的名字. 特有内容(name)随着对象存储 ...
- eclipse开启时报错问题
eclipse启动时报如下错误: Unable to read workbench state.Workbench UI layout will be reset 不能找到正式的工作台,工作台UI的布 ...
- 枚举、反射等 GetEnumName GetEnumDescription
/// <summary> /// Retrieves the name of the constant in the specified enumeration that has the ...