python抽象篇:面向对象
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抽象篇:面向对象的更多相关文章
- Python入门篇-面向对象概述
Python入门篇-面向对象概述 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.语言的分类 面向机器 抽象成机器指令,机器容易理解 代表:汇编语言 面向过程 做一件事情,排出个 ...
- python抽象篇:面向对象基础
1.面向对象概述 面向过程编程:根据操作数据的函数或语句块来设计程序的. 函数式编程:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象编程:数据和功能结合起来,用称为对象的东西包 ...
- Python 抽象篇:面向对象之高阶用法
1.检查继承 如果想要查看一个类是否是另一个类的子类,可以使用内建的issubclass函数 如果想知道已知类的基类,可以直接使用特殊特性__bases__ 同时,使用isinstance方法检查一个 ...
- Python 抽象篇:面向对象之类的方法与属性
概览:类成员之字段:-普通字段,保存在对象中,执行职能通过对象访问-静态字段,保存在类中,执行可以通过对象访问,也可以通过类访问类成员之方法:-普通方法,保存在类中,由对象来调用,self->对 ...
- python 15篇 面向对象
1.面向对象编程概念 面向对象是包含面向过程 面向过程编程 买车: 1.4s看车,买车 2.上保险 保险公司 3.交税 地税局 4.交管所 上牌面向对象编程 卖车处: 1.4s 2.保险 3.交税 4 ...
- (转)Python成长之路【第九篇】:Python基础之面向对象
一.三大编程范式 正本清源一:有人说,函数式编程就是用函数编程-->错误1 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的Python语法后,大家就可以写Python代码了,然后每个 ...
- 第五篇:python高级之面向对象高级
python高级之面向对象高级 python高级之面向对象高级 本节内容 成员修饰符 特殊成员 类与对象 异常处理 反射/自省 单例模式 1.成员修饰符 python的类中只有私有成员和公有成员两 ...
- 【Python之路】第七篇--Python基础之面向对象及相关
面向对象基础 基础内容介绍详见一下两篇博文: 面向对象初级篇 面向对象进阶篇 其他相关 一.isinstance(obj, cls) 检查obj是否是类 cls 的对象 class Foo(objec ...
- 第四篇:python 高级之面向对象初级
python 高级之面向对象初级 python 高级之面向对象初级 本节内容 类的创建 类的构造方法 面向对象之封装 面向对象之继承 面向对象之多态 面向对象之成员 property 1.类的创建 ...
随机推荐
- 作为一个新人,怎样学习嵌入式Linux
作为一个新人,怎样学习嵌入式Linux?被问过太多次,特写这篇文章来回答一下. 在学习嵌入式Linux之前,肯定要有C语言基础.汇编基础有没有无所谓(就那么几条汇编指令,用到了一看就会). C语言要学 ...
- jQuery自定义插件--banner图滚动
前言 jQuery是一个功能强大的库,提供了开发JavaScript项目所需的所有核心函数.很多时候我们使用jQuery的原因就是因为其使用插件的功能,然而,有时候我们还是需要使用自定义代码来扩展这些 ...
- Ensemble Learning: Bootstrap aggregating (Bagging) & Boosting & Stacked generalization (Stacking)
Booststrap aggregating (有些地方译作:引导聚集),也就是通常为大家所熟知的bagging.在维基上被定义为一种提升机器学习算法稳定性和准确性的元算法,常用于统计分类和回归中. ...
- taobao_api项目开坑,自主完成淘宝主要接口的开发-版本:卖家版(非淘宝api)
项目名称:taobao_api 项目目的:独立实现各个淘宝操作的相关api,不依赖淘宝提供的api,而是自己实现接口 前期实现接口:已付款订单查询(自动更新), 订单发货 , 订单备注 应用场景:中小 ...
- 接口interface,接口继承implements
php中,只支持从一个类继承,不支持从两个或者更多的类同时继承.从两个或者两个以上的类继承的能力被称为多重继承.php在设计上是禁止这种功能的.原因在于,避免多个类带来的复杂性.当发现需要从两个或者更 ...
- matplotlib学习之绘图基础
matplotlib:http://www.cnblogs.com/jasonhaven/p/7609059.html 1.基本图形 散点图:显示两组数据的值,每个点的坐标位置由变量的值决定,头一组不 ...
- PIC32MZ 通过USB在线升级 -- USB HID bootloader
了解 bootloader 的实现, 请加QQ: 1273623966(验证填bootloader); 欢迎咨询或定制bootloader; 我的博客主页 www.cnblogs.com/geekyg ...
- 表空间tablespace,数据文件datafiles,和控制文件control files介绍
https://docs.oracle.com/cd/B19306_01/server.102/b14220/physical.htm#i5919 本文系翻译 表空间tablespace,数据文件da ...
- Java面向对象 集合(中)
Java面向对象 集合(中) 知识概要: (1)泛型的体系概念 (2)泛型的特点 (3)自定义泛型类 泛型的体系概念 泛型:JDK1.5版 ...
- 对Jquery中的ajax再封装,简化操作
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...