面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。

本节对于面向对象的概念不做展开说明。本节主要内容是Python里如何使用面向对象编程。

分下面几部分:

1、类的格式

2、类的实例

3、类的封装

4、继承和多态

类的格式

下面是一个示例:

student.py

class Student(object):

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

通过例子可以发现:

1、类由class开头,类名首字母大写,类名后面的括号表示继承自基类object,所有类都会继承这个类;

2、类的构造方法是__init__,第一个参数是固定的,永远是self,类里面通过self调用属性和方法,不同于JAVA里使用this

现在来实例化类:

stu = Student('yjc', 22)
print(stu)
print(stu.name)
stu.print_score()

输出:

<__main__.Student object at 0x028811F0>
yjc
yjc: 22

Python里实例化类不用new关键字,而是像使用函数那样即可。调用类里的方法的时候不用传self参数。

类的封装

默认的,我们实例化了类后,可以直接访问对象里的属性,也可以去修改对象里的属性:

stu = Student('yjc', 22)
print(stu.name)
stu.print_score()
stu.name = 'Allen'
stu.print_score()

输出:

yjc
yjc: 22
Allen: 22

如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问(子类里也不能继承),所以,我们把Student类改一改:

class Student(object):

    def __init__(self, name, score):
self.__name = name
self.__score = score def print_score(self):
print('%s: %s' % (self.__name, self.__score)) stu = Student('yjc', 22)
print(stu.name)

输出:

Traceback (most recent call last):
File "/Projects/python/code/class/Student.py", line 12, in <module>
print(stu.__name)
AttributeError: 'Student' object has no attribute '__name'

这时候如果直接访问,就会报错。

继承和多态

在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类父类超类(Base class、Super class)。

继承示例:

class Animal(object):
def run(self):
print('runing') class Dog(Animal):
pass

以上Dog类继承了Animal类,从而获得父类的方法run()

dog = Dog()
dog.run()

输出:

runing

这里子类虽然没有写run()方法,但由于父类已经拥有,所以可以直接继承过来。

需要注意的是父类的私有变量(__开头的)子类是不能访问,也不能继承的。

再看看类的多态:

class Dog(Animal):
def run(self):
print('Dog is runing') class Cat(Animal):
def run(self):
print('Cat is runing') def runClass(obj):
obj.run() runClass(Animal())
runClass(Dog())
runClass(Cat())

输出:

runing
Dog is runing
Cat is runing

通过例子我们可以看到:

1、子类如果定义了和父类一样的方法,子类的会覆盖父类;

2、方法runClass接收一个Animal类,只要含有run()方法,均可正常运行,原因就在于多态。

类属性和实例属性

由于Python是动态语言,根据类创建的实例可以任意绑定属性。对于上面的Animal类,我们可以动态绑定新的属性:

a = Animal()
a.name = 'lala'

但这个绑定的属性属于实例,不属于类,其它Animal的实例是不能访问的。

在类里直接定义的属性,称为类属性,所有实例均可访问。

获取对象信息

type

最简单的,我们可以使用type()获取对象的类型:

>>> type(1)
<class 'int'>
>>> type('1')
<class 'str'>
>>> type(True)
<class 'bool'>
>>> type(1.2)
<class 'float'>
>>> type(None)
<class 'NoneType'>
>>> type(abs)
<class 'builtin_function_or_method'>
>>> type(lambda x:x*2)
<class 'function'>
>>> type([1,2])
<class 'list'>
>>> type((1,2))
<class 'tuple'>
>>> type({"name":"yjc"})
<class 'dict'>
>>> type((x for x in range(10)))
<class 'generator'>

还可以使用types模块进行判断:

>>> import types
>>> def f():pass
...
>>>
>>> type(f)==types.FunctionType
True
>>> type(f)==types.BuiltinFunctionType
False
>>> type(lambda x: x)==types.LambdaType
True
>>> type((x for x in range(10)))==types.GeneratorType
True

isinstance

对于类的继承关系,使用isinstance()会更方便:

class Animal(object):
def run(self):
print('runing') class Dog(Animal):
pass dog = Dog()
isinstance(dog, Dog)
isinstance(dog,object)

dir

如果要获得一个对象的所有属性和方法,可以使用dir()函数:

>>> import math
>>> dir(math)
['__doc__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'hypot', 'isfinite', 'isinf','isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'pi', 'pow', 'radians', 'sin','sinh', 'sqrt', 'tan', 'tanh', 'trunc']

类似__xxx__的属性和方法在Python中都是有特殊用途的,比如__len__方法返回长度。

getattr/setattr/hasattr

getattr()可以获取类的某个属性,setattr()可以设置类的某个属性,getattr()可以判断类是否拥有某个属性:

class Animal(object):
def __init__(self):
self.type = 'animal'
self.area = 'China' def run(self):
print('runing') class Dog(Animal):
pass dog = Dog() print(hasattr(dog,'type'))
print(hasattr(dog,'run'))
print(hasattr(dog,'name')) print(getattr(dog,'area')) # print(getattr(dog,'name')) setattr(dog, 'name', 'Aia')
print(getattr(dog,'name'))

输出:

True
True
False China Aia

使用getattr()尝试获取对象的一个不存在属性会报错。可以通过设置默认值避免:

print(getattr(dog,'city', 'beijing')) #beijing

Python学习--10 面向对象编程的更多相关文章

  1. Python学习之==>面向对象编程(二)

    一.类的特殊成员 我们在Python学习之==>面向对象编程(一)中已经介绍过了构造方法和析构方法,构造方法是在实例化时自动执行的方法,而析构方法是在实例被销毁的时候被执行,Python类成员中 ...

  2. 从0开始的Python学习014面向对象编程

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

  3. Python学习之==>面向对象编程(一)

    一.面向对象与面向过程 面向对象与面向过程是两种不同的编程范式,范式指的是按照什么方式去编程.去实现一个功能.不同的编程范式本质上代表对各种不同类型的任务采取不同的解决问题的思路. 1.面向过程编程 ...

  4. Python开发——10.面向对象编程进阶

    一.isinstance(obj,cls)和issubclass(sub,super) 1.isinstance(obj,cls) 判断obj是不是由cls产生的类 2.issubclass(sub, ...

  5. python学习_数据处理编程实例(二)

    在上一节python学习_数据处理编程实例(二)的基础上数据发生了变化,文件中除了学生的成绩外,新增了学生姓名和出生年月的信息,因此将要成变成:分别根据姓名输出每个学生的无重复的前三个最好成绩和出生年 ...

  6. Python:笔记(3)——面向对象编程

    Python:笔记(3)——面向对象编程 类和面向对象编程 1.类的创建 说明:和Java不同的是,我们不需要显示的说明类的字段属性,并且可以在后面动态的添加. 2.构造函数 构造函数的功能毋庸置疑, ...

  7. Python学习day40-并发编程(终)

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  8. Python学习day39-并发编程(各种锁)

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  9. Python学习day38-并发编程(线程)

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

随机推荐

  1. Java 设计模式 -- 示例指南

    设计模式在软件开发者中非常受欢迎的.每个设计模式都是对常见软件问题的通用的描述解决方案. 我们使用设计模式的好处有: 1.设计模式已经对于一个重复出现的问题进行了定义并且提供了工业标准的解决方案,因为 ...

  2. VS2015 ASP.NET5 Web项目

    VS2015 ASP.NET5 Web项目结构浅析   前言 本文个人同步博客地址http://aehyok.com/Blog/Detail/76.html 在安装好VS2015之后,一直想看看新版本 ...

  3. 使用QT来制作串口终端

    为什么要使用QT,因为它是跨平台的. 我现在使用的环境是Win7 64bit,使用VS的编译器来编译QT工程. 安装这套环境简单说一下:先到QT官网下载qt-windows-opensource-5. ...

  4. python基础课程_学习笔记20:标准库:有些收藏夹——os

    标准库:有些收藏夹 os os模块为您提供访问多个操作系统服务特征. os和它的子模块os.path还包含一些用于检查.构造.删除文件夹和文件的函数,以及一些处理路径的函数. os模块中一些重要函数和 ...

  5. 在ubuntu下开发stm32f4-discovery

    前面零散地记录了一些如何安装编译器,调试器等笔记,这里就准备开始着手试一下这整块系统了. 简单不完全地回顾一下所需要安装的软件: 1 编译器 使用的是codesourcey,因为之前有使用过该套编译器 ...

  6. three.js 源代码凝视(十六)Math/Frustum.js

    商域无疆 (http://blog.csdn.net/omni360/) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:商域无疆 -  本博客专注于 敏捷开发 ...

  7. solr的安装与配置

    solr的安装与配置 不久之前开发了一个项目,需要用到solr,因为所以在开始再网上查找资料,但是发现大部分的资料都是很片面的,要么就是只讲解solr如何安装的,要么就是只讲解solr的某一个部分的, ...

  8. 1951: [Sdoi2010]古文字猪

    1951: [Sdoi2010]古代猪文 链接:Click Here~ 题目: 一道非常好的组合数学题.!!.题目非常长.只是就以下几段话实用. iPig认为仅仅要符合文献,每一种能整除N的k都是有可 ...

  9. ASP.NET页面生命周期和asp.net应用程序生命周期

    作为一个asp.net程序员,不了解ASP.NET页面生命周期和asp.net应用程序生命周期是绝对不行的,那永远只能是菜鸟级别.我很早就学过,可是没次还是得去翻,一些事件还是记不住,还是记在自己的b ...

  10. Docker 01 Introduction

    Docker的组成: Docker Engine,一个轻量级.强大的开源容器虚拟化平台,使用包含了工作流的虚拟化技术,帮助用户建立.并容器化一个应用. Docker Hub,提供的一个SaaS服务,用 ...