1.面向对象概述

面向过程编程:根据操作数据的函数或语句块来设计程序的。

函数式编程:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可

面向对象编程:数据和功能结合起来,用称为对象的东西包裹起来组织程序的方法;

在大多数时候你可以使用面向过程编程,但是有些时候当需要编写大型程序或是寻求一个更加合适的解决方案的时候,就需要面向对象的编程,Python既可以提供面向过程的编程,也可以面向对象的编程,归根到底,Python语言是面向对象的编程语言。

2.创建类和对象

__metaclass__=type #确定使用新式类,这句话可以不写,内部自动调用
class Person: #创建类
def setName(self,name):#self是特殊参数,必填
self.name=name def getName(self):
return self.name def greet(self):
print("Hello,%s"%self.name)

>>> foo=Person()#根据类Person创建对象foo,实例化这个类
>>> foo.setName('greg')#执行setName方法,此时的foo就是类Person的实例化对象
>>> foo.greet() #执行greet方法
Hello,greg

#实例化,其实就是以Person类为模版,在内存里开辟一块空间,存上数据,赋值成一个变量名

所有的对象都属于某一个类,称为类的实例(instance)

foo=Person()叫做类的“实例化”, 就是把一个虚拟的抽象的类,通过这个动作,变成了一个具体的对象了, 这个对象就叫做实例

类的执行逻辑

定义类时,所有位于class语句中的代码都在特殊的命名空间中执行——类命名空间(class namespace)。

这个命名空间可由类内所有成员访问,类的定义其实就是执行代码块,在类的定义区并不只限只能使用def语句。

>>>class C:
print("Class C being defined")
#运行
>>>Class C being defined
class Person(object):
def __init__(self, name):
self.name = name def hello(self):
print("hello,%s" %self.name) obj=Person("greg")
obj.hello() #hello,greg
print(Person)#<class '__main__.Person'>
即使不实例化,这个Person类本身也是已经存在内存里了

3.对象的魔力

3.1 多态(Polymorphism):意味着可以对不同类的对象使用相同的操作。

def add(x,y):
return x+y print(add(1,2))
print(add('Fish','license')) def length_message(x):
print("长度:",repr(x),"是",len(x)) print(length_message('gregory'))
print(length_message([1,2,3]))

python里的很多函数和运算符都是多态的,只要使用多态函数和运算符,就会与多态发生关联。

唯一能够毁掉多态的就是使用函数显式地检查类型,比如type,isinstance,issubclass函数等。

多态的形式在Python里也被称为鸭子类型duck typing

class F1:
pass class S1(F1):
def show(self):
print('S1.show') class S2(F1):
def show(self):
print('S2.show') def Func(obj):
print (obj.show()) s1_obj = S1()
Func(s1_obj) s2_obj = S2()
Func(s2_obj)

3.2 封装(Encapsulation): 即对外部世界隐藏对象的工作细节。

封装是指向程序中的其他部分隐藏对象的具体实现细节的原则。和多态类似,也是使用对象而不用知道其内部细节。

区别在于:多态可以让用户对于不知道是什么类(对象类型)的对象进行方法调用,而封装是可以不用关心对象是如何构建的而直接进行使用。

class Person:
def __init__(self,name,age):
#构造方法,类名()自动执行构造方法
self.n=name
self.a=age
self.b='o型'
def show(self):
print('%s-%s-%s'%(self.n,self.a,self.b))
obj1=Person('greg',18)
#直接调用对象的属性
print(obj1.name)
#间接调用
Python默认会将obj1传给self参数,即:obj1.show(obj1)
obj1.show()

在使用面向对象的封装特性时,需要:

1)将内容封装到某处

2)从某处调用被封装的内容

对于面向对象的封装来说,其实就是使用构造方法将内容封装到 对象 中,然后通过对象直接或者self间接获取被封装的内容。

3.3 继承(Inheritance): 以通用的类为基础建立专门的类对象。

继承
class G:
def g1(self):
print('G.g1')
class F(G): #父类,基类
def f1(self):
print('F.f1')
def f2(self):
print('F.f2')
class S(F): #子类,派生类
def s1(self):
print('S.s1')
def f2(self):
super(S,self).f2() #固定写法,执行父类(基类)中的f2方法
print('S.s2')
# F.f2(self) #执行父类(基类)中的f2方法 obj=S()#self执行当前方法的对象
# obj.s2()#s1中的self是形参,此时代指obj
obj.f2()#self永远指调用方法的调用者
# obj.g1()
self永远是执行方法的调用者
supper(子类,self).父类中的方法 (...)
父类名.父类中的方法(self,...)

多继承

1、Python的类可以继承多个类,Java和C#中则只能继承一个类

2、Python的类如果继承了多个类,从做到右一次查找,找不到会报错

class Base:
def a(self):
print('Base.a')
class F0(Base):
def a1(self):
print('F0.a')
class F1(F0):
def a1(self):
print('F1.a')
class F2(Base):
def a(self):
print('F2,a')
class S(F1,F2):
pass
obj=S()
obj.a() #从左到右找,查找顺序S-->F1-->F2

python抽象篇:面向对象的更多相关文章

  1. Python入门篇-面向对象概述

    Python入门篇-面向对象概述 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.语言的分类 面向机器 抽象成机器指令,机器容易理解 代表:汇编语言 面向过程 做一件事情,排出个 ...

  2. python抽象篇:面向对象基础

    1.面向对象概述 面向过程编程:根据操作数据的函数或语句块来设计程序的. 函数式编程:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象编程:数据和功能结合起来,用称为对象的东西包 ...

  3. Python 抽象篇:面向对象之高阶用法

    1.检查继承 如果想要查看一个类是否是另一个类的子类,可以使用内建的issubclass函数 如果想知道已知类的基类,可以直接使用特殊特性__bases__ 同时,使用isinstance方法检查一个 ...

  4. Python 抽象篇:面向对象之类的方法与属性

    概览:类成员之字段:-普通字段,保存在对象中,执行职能通过对象访问-静态字段,保存在类中,执行可以通过对象访问,也可以通过类访问类成员之方法:-普通方法,保存在类中,由对象来调用,self->对 ...

  5. python 15篇 面向对象

    1.面向对象编程概念 面向对象是包含面向过程 面向过程编程 买车: 1.4s看车,买车 2.上保险 保险公司 3.交税 地税局 4.交管所 上牌面向对象编程 卖车处: 1.4s 2.保险 3.交税 4 ...

  6. (转)Python成长之路【第九篇】:Python基础之面向对象

    一.三大编程范式 正本清源一:有人说,函数式编程就是用函数编程-->错误1 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的Python语法后,大家就可以写Python代码了,然后每个 ...

  7. 第五篇:python高级之面向对象高级

    python高级之面向对象高级   python高级之面向对象高级 本节内容 成员修饰符 特殊成员 类与对象 异常处理 反射/自省 单例模式 1.成员修饰符 python的类中只有私有成员和公有成员两 ...

  8. 【Python之路】第七篇--Python基础之面向对象及相关

    面向对象基础 基础内容介绍详见一下两篇博文: 面向对象初级篇 面向对象进阶篇 其他相关 一.isinstance(obj, cls) 检查obj是否是类 cls 的对象 class Foo(objec ...

  9. 第四篇:python 高级之面向对象初级

    python 高级之面向对象初级   python 高级之面向对象初级 本节内容 类的创建 类的构造方法 面向对象之封装 面向对象之继承 面向对象之多态 面向对象之成员 property 1.类的创建 ...

随机推荐

  1. xml跟sql查找

    xml小白笔记 ....... <sql id="wDishesColumns"> a.id AS "id", a.pid AS "pid ...

  2. [js高手之路] html5 canvas系列教程 - 像素操作(反色,黑白,亮度,复古,蒙版,透明)

    接着上文[js高手之路] html5 canvas系列教程 - 状态详解(save与restore),相信大家都应该玩过美颜功能,而我们今天要讲的就是canvas强大的像素处理能力,通过像素处理,实现 ...

  3. 第5章 不要让线程成为脱缰的野马(Keeping your Threads on Leash) ----初始化一个线程

    使用线程的一个常见问题就是如何能够在一个线程开始运行之前,适当地将它初始化.初始化最常见的理由就是为了调整优先权.另一个理由是为了在SMP 系统中设定线程比较喜欢的 CPU.第10 章谈到 MFC 时 ...

  4. Mysql配置文件my.cnf详细说明

    [表名大小写配置] MySQL在Linux下数据库名.表名.列名.别名大小写规则:  1.数据库名与表名是严格区分大小写  2.表的别名是严格区分大小写  3.列名与列的别名在所有的情况下均是忽略大小 ...

  5. ElasticSearch入门(1) —— 集群搭建

    一.环境介绍与安装准备 1.环境说明 2台虚拟机,OS为ubuntu13.04,ip分别为xxx.xxx.xxx.140和xxx.xxx.xxx.145. 2.安装准备 ElasticSearch(简 ...

  6. 数据分析前戏:ipython使用技巧(上)

    不一定非得使用Jupyter Notebook,试试ipython命令行 安装 ipython 我只试过Windows 10环境下的. 1.安装python安装包之后,应该就有ipython了. 2. ...

  7. SUM游戏

    题意:就是有一个长度为n的整数序列,两个游戏者A和B轮流取数,A先取.每次玩家只能从左端或者右端取任意数量个数,但不能两端都取. 所有数都被取走后游戏结束,然后统计每个人取走的所有数之和,作为各自的得 ...

  8. SQLserver2008r2安装过程

    首先,下载SQLserver2008的安装包,下载完成打开是以下界面 点击开始安装,随着安装进程,点下一步 . 接着来到设置角色的过程,点击SQL功能安装 然后按下一步,来到功能选择,点击" ...

  9. tesseract-ocr字库训练图文讲解

    第一步合成图片集 你需要把使用jTessBoxEditor工具把你的训练素材及多张图片合并成一张tif格式的图片集 第二步  生成box文件 运行tesseract命令,tesseract mjorc ...

  10. Java面向对象 正则表达式

     Java面向对象 正则表达式 知识概要:                (1)正则表达式的特点 (2)正则表达的匹配 (3)正则表达式的切割,替换,获取 (4)正则表达式的练习 正则表达式:符合 ...