一、面向对象的编程
面向对象程序设计--Object Oriented Programming,简称oop,是一种程序设计思想。
二、面向对象的特性
类:class
类,对比现实世界来说就是一个种类,一个模型。
一个类即是对一类拥有相同属性的对象的抽象、蓝图、原型。
在类中定义了这些对象的都具备的属性(variables(data))、共同的方法。 对象:object
对象,也就是指模型造出来的具体的东西。
一个对象即是一个类的实例化后实例,一个类必须经过实例化后方可在程序中调用,一个类可以实例化多个对象,每个对象亦可以有不同的属性,就像人类是指所有人,每个人是指具体的对象,人与人之前有共性,亦有不同。 实例化:
初始化一个类,造了一个对象。把一个类变成一个具体的对象的过程,叫做实例化。
以下是一段小代码讲解实例化和调用
 class BuyCar(object):
def sale(self):
print('卖车')
return 100
def insurance(self):
print('买保险')
def check(self):
print('验车')
def card(self):
print('选牌')
def pay(self):
print('付款')
def done(self):
print('上牌完成') me = BuyCar()
#实例化
r = me.sale()
接收函数返回值
print(r)
me.check()
me.card()
me.pay()
me.done()
# 如果是函数名加括号的话,调用函数
# 如果是类名加括号的话,实例化对象
封装:
把一些功能的实现细节不对外暴露,类中对数据的赋值、内部调用对外部用户是透明的,这使类变成了一个胶囊或容器,里面包含着类的数据和方法。
比如说造的一个人,你把他身体内部的什么心肝脾肺肾都封装起来了,其他人都看不到,你直接找这个人。 继承:
一个类可以派生出子类,在这个父类里定义的属性、方法自动被子类继承。比如说你继承了你父亲的姓。 python3中多继承都是广度优先,python2中经典类的多继承是深度优先,新式类的多继承是按照广度优先的。 继承是为了代码的重用 多态:
对不同类的对象发出相同的消息将会有不同的行为。比如,你的老板让所有员工在九点钟开始工作, 他只要在九点钟的时候说:“开始工作”即可,而不需要对销售人员说:“开始销售工作”,对技术人员说:“开始技术工作”, 因为“员工”是一个抽象的事物, 只要是员工就可以开始工作,他知道这一点就行了。至于每个员工,当然会各司其职,做各自的工作。
多态就是抽象化的一种体现,把一系列具体事物的共同点抽象出来, 再通过这个抽象的事物, 与不同的具体事物进行对话。 一种接口,多种实现。
三、类
一些概念:
属性:属性就是类里面的一个变量,有类变量和实例变量,类变量是类在定义的时候就有的,实例变量是在实例化的时候才产生的变量。这个可以理解为,人是一个类,他的名字、年龄、性别就是它的属性。 方法:方法就是类的功能,也就是定义在类里面的函数,它实现了某个功能,比如说人有睡觉的功能。 构造函数:什么是构造函数,就是类在实例化的时候做的某些初始化操作,比如说人,你造一个汽车的时候,它得有颜色、型号等等。 析构函数:析构函数就是这个实例在销毁的时候做的一些操作。 定义类:
定义类使用class关键字,类名一般我们开发的时候首字母要大写。python中有经典类和新式类,他俩在python3中没有区别,在python2中经典类在多继承的时候是深度优先,新式类是广度优先。python3中统一是广度优先,这个后面在说继承的时候会说。
 class Cay(object):
# wheel = 4
#类变量,所有的实例都可以使用
def __del__(self):
# 析构方法
# 作用是对象被销毁时执行
# 这个实例被销毁的时候执行的,也就是不在内存里面
print('over、、、')
def __init__(self,color,pl,pz):
#构造方法,是类在实例化对象的做的操作
#如果你想在类初始化的给它传一些参数,那么就要在
#构造方法里面写参数
self.color = color
#给实例化的对象添加属性
# 对象的color等于我传进来的color
self.pl = pl
self.pz = pz
# 这些都是实例变量
def run(self):
print('run')
print('汽车的颜色是:',self.color)
def driver(self):
#self就是代表实例化之后的这个对象,为了节省内存
#代表本类对象
print('driver')
def movie(self):
print('movie')
def p(self):
self.wheel = 8
print(self.wheel) ywn_car = Cay('red','5.0','悍马')
ywn_car.p()
ywb_car = Cay('red','5.0','悍马')
# print(ywb_car.wheel)
1.在此处说明一下self。在我们进行实例化的时候可以无穷无尽的实例化对象,在这个类里面所有的对象都有run,driver,movie和
p的功能,所有的功能都是一样的,但是这些color,pl,pz的属性可以是不一样的,如果每个对象实例化的时候都保存一遍这些公共
没变的东西就会特别浪费内存,就不需要对每一个实例化对象的时候对公共的功能进行定义。
那么如果不定义的话怎么知道究竟是谁调用的这些方法呢?所以用到了self。谁调用的话把谁传进去就行了。这样的话就知道是谁调用了。
所以把self传进去,self就是代表实例化之后的这个对象,使用self是为了节省内存。self作为必填参数在调用的时候不需要传,自动
会把这个对象加进去。也就是self代表的是本类对象.
2.__init__。这个叫做构造方法,实在类的实例化的时候做的操作,如果你想在类初始化的时候就给它传一些参数就要用到__init__了。
比如说我造汽车,你不给我说我哪知道你要什么样的汽车,所以这些东西你必须要先跟我说,想要实现这个就要使用__init__。
在self里面的写的东西,不论在哪都能用点能点出来
3.object是基类。实例化,在内存中存储,都是通过object来实现的
4.__del__。这个叫做析构方法,实例被销毁时所执行的。当程序执行完,对象才会被销毁掉。那么这个方法什么时候能用到呢?比如在关数据库连接的时候,当数据库不用了
的时候这个类运行后就会自动关了。
5.类变量:在类里面定义的变量就是类变量,类变量是所有的实例变量都能用,相当于公共的。用的时候还是self.wheel,和实例变量一样 通过下面这段代码介绍一下私有方法和私有变量,变量名前面加两个下划线就是私有变量,方法名前面加两个下划线就是私有变量.
 import xlrd
class ReadCase(object):
__name='haha'
# 私有变量
# 类变量,只能在类里面访问,出了类就不行了
def __init__(self,f_name):
self.fname=f_name
def __set(self):
self.money=1999999
# 私有方法就是在函数名前面加俩下划线,只能在类里面调用,出了类访问不了
print('这个是私有方法:',self.money)
def read_case(self):
self.__set()
# book=xlrd.open_workbook(self.fname)
print('私有变量name的值:',self.__name)
self.__name='panyang'
print('私有变量name的值:', self.__name)
r=ReadCase('a.xls')
# print(r.__name) 这句报错
r.read_case()
# print(r.name)
r.__set()
# 私有变量只能在类里面使用,出了类就不能用了
# 所有的私有方法和私有类,出了这个类就用不了了
面向对象的三大特点:封装,继承,多态
封装:就相当于给你封装好了功能,你看不见,只能用.
继承:
继承就是父类有的方法,子类都可以用。看一下下面这段代码:
 class Person(object):
def __init__(self,name,sex):
self.name=name
self.sex=sex
def Cry(self):
print('%s[哭]'%self.name)
class Man(Person):
def Work(self):
print('working')
class Women(Person):
def shopping(self):
print('shopping')
class Children(Man,Women): # 多继承
pass
panyang=Women('panyang','nv')
panyang.shopping()
panyang.Cry()
那么问题来了,如果继承的两个父类有相同的属性,那继承的是哪个父类的属性呢?看下面的代码:
 class A(object):
def say(self):
print('A')
class B(A):
def say(self):
print('B')
class C(A):
def say(self):
print('c')
class D(C, B):
pass
d = D()
d.say()
python3里面多继承的时候,都是广度优先
python2里面多继承的时候,如果用的是经典类,那么是深度优先;如果是新式类的话,是广度优先。深度优先和广度优先会在下一篇博客里面说到。
多态:
在python里面没有多态,不能直接实现多态,但是可以间接实现多态,代码如下:
 class Person(object):
def __init__(self,name,sex):
self.name=name
self.sex=sex
def Cry(self):
print('%s[哭]'%self.name)
class Man(Person):
def Work(self):
print('working')
class Women(Person):
def shopping(self):
print('shopping')
class Children(Man,Women):
pass
panyang=Women('panyang','nv')
panyang.shopping()
panyang.Cry()
python间接实现多态
修改父类的方法:
 class Animal(object):
def __init__(self,name):
self.name = name
print('这个是animal里面的init')
class Cat(Animal):
def speak(self):
print('喵喵喵')
class Dog(Animal):
#在父类方法的基础上添加新功能
def __init__(self,name,color):
# 在重写父类方法的时候,先要调用一下父类的这个方法
把父类里面的方法重写了,如果子类里面重写了父类的方法就直接调用子类重写的方法
Animal.__init__(self,name)
#把父类里面的方法重写
#如果子类里面重写了父类的方法,那么直接调用子类的重写后的方法
self.color = color
def speak(self):
print('【%s】汪汪汪'%self.name,self.color)
xh = Dog('小黑','black')
xh.speak()
一种方法,多种实现
c1 = Cat()
d1 = Dog()
obj = [c1,d1]
for i in obj:
i.speak()
下面再说一下静态方法和类方法:
 class Stu(object):
country = 'china' # 类变量
def __init__(self, name):
self.name = name
@staticmethod
# 静态方法和普通的函数没有任何区别,只不过是写在类里面而已
# 静态方法,和类本身没有什么关系了,就相当于在类里面定义了一个方法而已
def say():
print('xxx')
@classmethod
# 类方法
# 静态方法,和类方法不同的是,它可以使用类变量,必须要传一个值,代表的就是这个类
def hello(cls):
print(cls.country)
def hi(self):
# 这个是实例方法
print(self.name)
t = Stu('name')
Stu.hello()
Stu.say()
t.hi() # 类方法可以不进行实例化,直接调用
t.say()
t.hello()
												

python学习笔记--面向对象的编程和类的更多相关文章

  1. Python 2.7 学习笔记 面向对象的编程

    python是一种面向对象的语言.本文介绍如何用python进行面向对象的编程. 首先我们说下对象和类,类是一种类型的定义,对象是类的实例. 一.内置对象类型(内置类) 其实我们前面已经大量用到了对象 ...

  2. python学习笔记----面向对象

    面向对象 类:成员变量(属性) 方法(操作成员变量) 出一个场景:玩过游戏.主人公,进入了一个场景,有10个小怪物是一样的.有攻击力,血(100格).如果小怪物有多个数值需要管理,小怪物的血量.小怪物 ...

  3. Python学习--11 面向对象高级编程

    多重继承 Python里允许多重继承,即一个类可以同时继承多个类: class Mammal(Animal): pass class Runnable(object): def run(self): ...

  4. python学习笔记-面向对象设计

    前言 1.三大编程范式: 面向过程编程 函数式编程 面向对象编程 2.编程进化论 1.编程最开始就是无组织无结构,从简单控制流中按步写指令 2.从上述的指令中提取重复的代码块或逻辑,组织到一起,便实现 ...

  5. python学习笔记:第19天 类的约束、异常、MD5和logging

    目录 一.类的约束 二.异常处理: 三.MD5加密 四.日志(logging模块) 一.类的约束 真正写写项目的代码时都是多人协作的,所以有些地方需要约束程序的结构.也就是说,在分配任务之前就应该把功 ...

  6. Python学习笔记6 函数式编程_20170619

    廖雪峰python3学习笔记: # 高阶函数 将函数作为参数传入,这样的函数就是高阶函数(有点像C++的函数指针) def add(x, y): return x+y def mins(x, y): ...

  7. python学习笔记11 ----网络编程

    网络编程 网络编程需要知道的概念 网络体系结构就是使用这些用不同媒介连接起来的不同设备和网络系统在不同的应用环境下实现互操作性,并满足各种业务需求的一种粘合剂.网络体系结构解决互质性问题彩是分层方法. ...

  8. python学习笔记10 ----网络编程

    网络编程 网络编程需要知道的概念 网络体系结构就是使用这些用不同媒介连接起来的不同设备和网络系统在不同的应用环境下实现互操作性,并满足各种业务需求的一种粘合剂.网络体系结构解决互质性问题彩是分层方法. ...

  9. python学习笔记系列----(七)类

    7.1 python类和相关术语的简介 Python 通过最小的新语法和语义在语言中实现了类. 它是 C++ 或者 Modula-3 语言中类机制的混合.类的大多数重要特性都被完整的保留下来:类继承机 ...

随机推荐

  1. AJPFX总结I/O流操作(一)

    在软件开发中,数据流和数据库操作占据了一个很重要的位置,所以,熟悉操作数据流和数据库,对于每一个开发者来说都是很重要的,今天就来总结一下I/O,数据库操作 一:从数据流开始 首先先有一个结构图看一下整 ...

  2. Elasticsearch (1) - 索引库 文档 分词

    创建索引库 ES的索引库是一个逻辑概念,它包括了分词列表及文档列表,同一个索引库中存储了相同类型的文档.它就相当于MySQL中的表,或相当于Mongodb中的集合. 关于索引这个语: 索引(名词):E ...

  3. windows下常用的一些shell命令

    看的视频上都是linux系统的shell命令,和windows区别很多.所以整理了windows常用的一些shell命令. 注意:并不是每个都试验过,使用时还需自己验证下. 学system和os,su ...

  4. sys模块详解

    1.sys.argv argv是「argument variable」参数变量的简写形式,一般在命令行调用的时候由系统传递给程序.这个变量其实是一个List,argv[0] 一般是“被调用的脚本文件名 ...

  5. vue同胞组件通讯解决方案(以下为一种另外可用vuex解决)

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. HDU 5391 Zball in Tina Town (打表,水)

    题意: Tina有一个球,它的名字叫zball.zball很神奇,它会每天变大.在第一天的时候,它会变大1倍.在第二天的时候,它会变大2倍.在第n天的时候,它会变大n倍.zball原来的体积是1.Ti ...

  7. 原创:E325: ATTENTION vim超完整超给力的问题与解决方法

    又到了老葵花哥哥开课的时间 这是给大家提供一个企业常见的错误 我相信大家生活还编程中会长期使用接触这个错误 这里我们经常用的两个选项 (E)dit any way 编辑原来的文件,忽略刚刚做的修改 ( ...

  8. Springboot 图标更换

    1.将自己的logo图片转为.ico格式的,命名必须为[favicon.ico] 2.将该图片直接放在src/main/resourecs目录下 3.重启项目,刷新一下浏览器缓存,就会发现图标更换了

  9. Linux下使用vi命令后退出方式

    退出Vi         当编辑完文件,准备退出Vi返回到shell时,可以使用以下几种方法之一.         在命令模式中,连按两次大写字母Z,若当前编辑的文件曾被修改过,则Vi保存该文件后退出 ...

  10. ibatis 实现 物理级别的 分页 兼容多种数据库(转载)

    最近在看iBatis时,想做用动态Sql做个分布.因为在做项目时用iBator工具生成没有分页的功能,只有一些我们常用的功能.所以要对生成后的代码做修改.我在Java高手真经的一书中看到有做了MySq ...