面向对象编程简单来说就是基于对  和 对象 的使用,所有的代码都是通过类和对象来实现的编程就是面向对象编程!

面向对象的三大特性:封装、继承、多态

首先创建一个类

#使用class创建一个School类,类中有个student方法
class School:
def student(self):
pass
a1=School()

一、封装

1、封装:将某些内容先封装到一个地方,等到需要的时候再去调用

class School:
def __init__(self,name,age): #构造方法,创建对象是执行
self.name=name
self.age=age #创建对象a1,a2
a1=School("zhangsan",18)
a2=School("lisi",18)

上面代码实现的就是封装的功能,把各自的name和age分别封装到了self的name和age属性中,就等于被封装到了对象a1和a2中

类中定义的函数叫做方法,带有__init__的函数称为构造方法,在创建a1,a2对象时会自动执行。

2、调用:调用有两种方式,通过对象直接调用和通过self间接调用

通过对象直接调用

class School:
def __init__(self,name,age):
self.name=name
self.age=age def student(self):
print("name:%s,age:%s"%(self.name,self.age))
#创建对象a1,a2
a1=School("zhangsan",18)
a2=School("lisi",18)
print a1.name,a1.age
print a2.name,a2.age
#执行结果: zhangsan 18
      lisi 18

通过self间接调用

class School:
def __init__(self,name,age):
self.name=name
self.age=age def student(self):
print("name:%s,age:%s"%(self.name,self.age))
#创建对象a1,a2
a1=School("zhangsan",18)
a2=School("lisi",18) #执行类中的方法时,通过self间接调用被封装的内容
a1.student()
a2.student()
#执行结果:
#name:zhangsan,age:18
#name:lisi,age:18

二、继承

1、继承:既派生类(子类)可以继承基类(父类)的方法,我们可以将多个类共有的方法提取到父类当中,这样子类仅需继承父类而不必一一实现每个方法

在类名后面括号中写上另一个类,表示继承了那个类

#使用class创建一个School类
class School:
def __init__(self,name,age):
self.name=name
self.age=age def student(self):
print("name:%s,age:%s"%(self.name,self.age))
def classroom(self):
print("%s去教室"%self.name) class SchoolA(School): #SchoolA继承School
def __init__(self,name):
self.name=name class SchoolB(SchoolA): #SchoolB继承SchoolA
def __init__(self,name):
self.name=name
#创建对象a1
a1=SchoolA("zhangsan")
a1.classroom()
#创建对象a2
a2=SchoolB("lisi")
a2.classroom() #执行结果:
# zhangsan去教室
# lisi去教室

在上面代码中我们可以看到,在SchoolA和SchoolB中都没有classroom方法,但由于SchoolB继承了SchoolA,而SchoolA又继承了School,所以他们创建对象后都能

调用School中的classroom方法。

2、多继承

在python中,类还可以继承多个类,在继承多个类时,他对类中的函数查找有两种方式

  深度优先:类是经典类时,多继承情况下,会按照深度优先方式查找

  广度优先:类是新式类时,多继承情况下,会按照广度优先方式查找

(在python3.x中)都默认为广度优先,但还是可以了解一下两个的区别,新式类:当前类或者基类继承了objiect类就叫新式类,否者就是经典类

在python2.7中

#python2.7中经典类
class A():
def name(self):
print("AAAAAA")
class B(A):
pass
class C(A):
def name(self):
print("CCCCCC")
class D(B,C):
pass
a1=D()
a1.name() #输出:AAAAAA
#查找顺序:# 首先去自己D类中查找,如果没有,则继续去B类中找,没有则继续去A类中找,没有则继续去C类中找,如果还是未找到,则报错
#深度优先:D-B-A-C
#python2.7中新式类
class A(object):
def name(self):
print("AAAAAA")
class B(A):
pass
class C(A):
def name(self):
print("CCCCCC")
class D(B,C):
pass
a1=D()
a1.name() #输出:CCCCCC
#查找顺序:# 首先去自己D类中查找,如果没有,则继续去B类中找,没有则继续去C类中找,没有则继续去A类中找,如果还是未找到,则报错
#广度优先:D-B-C-A

上面两个例子中我们可以看到,经典类和新式类输出的结果是不一样的,是因为他们的查找顺序不一样

python2.7中 广度优先的前提条件:D继承BC,BC又同时继承A,只有满足这个条件,新式类才会遵循广度优先,否者不会,例:

class A(object):
def name(self):
print("AAAAAA")
class B(A):
pass
class C:
def name(self):
print("CCCCCC")
class D(B,C):
pass
a1=D()
a1.name() #输出:AAAAAA

如果C不在继承A,那么就算你是新式类,他也会按照深度优先的顺序查找

在python3.X之后就没有了上面的这些区别,它的查找顺序都是 广度优先 

三、多态

python不支持多态,也用不到多态,python是一种多态语言,崇尚鸭子类型

 四、类中的成员

类中的成员:字段、方法、属性

1、字段

字段:普通字段、静态字段

class School:
headmaster="王五"
def __init__(self,name,age):
self.name=name
self.age=age def student(self):
print("name:%s,age:%s"%(self.name,self.age)) #创建对象a1
a1=School("zhangsan",18)
print(a1.name) #访问普通字段
print(School.headmaster) #访问静态字段 #执行结果:
# zhangsan
# 王五

在上面代码中,__init__函数中的就是普通字段,headmaster就是静态字段

  普通字段:属于对象,由对象来访问,在内存中每个对象都要保存一份

  静态字段:属于类,由类直接访问,在内存中只保存一份

2、方法

方法:普通方法、静态方法、类方法

class School:
headmaster="王五"
def __init__(self,name,age):
self.name=name
self.age=age def student(self): #普通方法 至少一个self
print("普通方法") @staticmethod #静态方法 任意参数
def classroom():
print("静态方法") @classmethod
def dormitory(cls): #类方法 只能一个cls
print("类方法",cls) #创建对象a1
a1=School("zhangsan",18)
a1.student() School.classroom() #访问静态方法
School.dormitory() #访问类方法 '''执行结果:
普通方法
静态方法
类方法 <class '__main__.School'>
'''

普通方法:先创建一个对象,在用对象去调用这个方法

静态方法:直接用类调用,可以有任意参数(静态方法可以让类直接调用,省去了普通方法创建对象的步骤)

类方法:直接用类调用,只能一个cls参数

    上面我们可以看到执行类方法时,输出了他传入的参数等于<class '__main__.School'>,是一个类,意思就是执行时,它会把当前的类当成参数传进去。

3、属性

属性定义:装饰器定义、静态字段定义

(1)装饰器定义

class School:
headmaster="王五"
def __init__(self,name,age):
self.name=name
self.age=age def student(self): #方法
print("方法") @property
def classroom(self): #属性,加上@property装饰器,仅有一个self参数
print("属性") #创建对象a1
a1=School("zhangsan",18)
a1.student() #调用方法
a1.classroom #调用属性 #执行结果:
# 方法
# 属性

在上面代码中可以看到,在方法上加上@property装饰器就叫属性,属性和方法的区别就是调用时不用加括号

在新式类中,除了@property,还有另外两种装饰器

class School(object):
def __init__(self,name,age):
self.name=name
self.age=age @property
def classroom(self): #属性,加上@property装饰器,仅有一个self参数
print(self.name,self.age)
@classroom.setter
def classroom(self,age):
self.age=age #把age修改为传入的参数
print("修改",self.name,self.age)
@classroom.deleter
def classroom(self):
del self.age #删除age
print("删除",self.name,self.age) #创建对象a1
a1=School("张三",18)
a1.classroom #1.执行后会自动调用@property方法
a1.classroom=20 #2.执行后会自动调用@classroom.setter的方法,并将20传给age参数
del a1.classroom #3.执行后会自动调用@classroom.deleter的方法 '''执行结果:
张三 18
修改 张三 20
在执行3时会报错,因为age已经在@classroom.deleter下面的方法里删除了,所以输出self.age时会出错
'''

(2)静态字段定义

class School(object):
def __init__(self,name,age):
self.name=name
self.age=age def classroom(self):
print(self.name,self.age) def classroom_update(self,age):
self.age=age #把age修改为传入的参数
print("修改",self.name,self.age) def classroom_del(self):
del self.age #删除age
print("删除",self.name,self.age) obj=property(classroom,classroom_update,classroom_del) #静态字段方式定义属性 #创建对象a1
a1=School("张三",18)
a1.obj #1.执行后会自动调用classroom方法
a1.obj=20 #2.执行后会自动调用classroom_update的方法,并将20传给age参数
del a1.obj #3.执行后会自动调用classroom_delr的方法

4、公有成员和私有成员

在类中的每一个成员都有两种形式:公有、私有

公有:都可以访问      私有:只有在类的内部可以访问

举几个例子

字段

class School(object):
deg="狗" #公有静态字段
__cat="猫" #私有静态字段
def __init__(self,name,age):
self.name=name #公有普通字段
self.__age=age #私有普通字段 def dormitory(self):
print(self.__age) def cat(self):
print(School.__cat) #创建对象a1
a1=School("张三",18)
#访问普通字段
print(a1.name) #输出:张三
print(a1.age) #报错,提示没有age,因为age是私有字段,只能间接内部访问
a1.dormitory() #只能通过类内部访问私有字段
#访问静态字段
print(School.deg) #输出:狗
print(School.__cat) #报错
a1.cat() #输出:猫 可以间接通过内部的cat方法反问私有静态字段

方法

class School(object):

    def __init__(self,name,age):
self.name=name
self.__age=age def cat(self): #公有方法
print("cat") def __dog(self): #私有方法
print("dog") def doo(self): #内部访问私有方法
a1.__dog()
#创建对象a1
a1=School("张三",18)
a1.cat() #输出:cat
a1.dog() #报错
a1.doo() #输出:dog 间接通过doo方法反问私有方法__dog

类中的其他成员也和上面的类似

如果想要强制访问私有字段,可以通过(对象._类名__私有字段名)访问,不建议强制访问私有成员。

5、类中的特殊成员

(1)__doc__

class School(object):
"""类的描述信息"""
def __init__(self,name,age):
self.name=name
self.__age=age print(School.__doc__) #输出:类的描述信息

(2)__init__

在上面已经说过,在创建对象是自动执行

(3)__del__

当对象在内存中被释放时,自动触发执行

(4)__call__

在创建的对象后面加括号执行时,会自动执行类里的__call__方法

class School(object):

    def __call__(self, *args, **kwargs):
print("触发__call__方法") a1=School()
a1() #输出:触发__call__方法
School()() #输出:触发__call__方法

(5)__dict__

获取类或对象的所有成员

class School(object):
"""类的描述信息"""
cat="猫"
def __init__(self,name,age):
self.name=name
self.__age=age
def dog(self):
print("dog") print(School.__dict__) #获取类中的成员
a1=School("张三",18)
print(a1.__dict__) #获取对象中的成员
'''
输出:
{'cat': '猫', '__init__': <function School.__init__ at 0x000000000226C950>, '__dict__': <attribute '__dict__' of 'School' objects>, '__weakref__': <attribute '__weakref__' of 'School' objects>, '__module__': '__main__', 'dog': <function School.dog at 0x000000000226CAE8>, '__doc__': '类的描述信息'}
{'name': '张三', '_School__age': 18}
'''

(6)__str__

没有__str__

class School(object):
def __init__(self,name,age):
self.name=name
self.__age=age
a1=School("张三",18)
print(a1) #输出:<__main__.School object at 0x000000000222B278>

有__str__

class School(object):
def __init__(self,name,age):
self.name=name
self.__age=age def __str__(self):
return("print对象时的返回值")
a1=School("张三",18)
print(a1) #输出:print对象时的返回值

其他的特殊成员就不一一列举了,因为大多数情况下也不会用到

详细请看:http://www.cnblogs.com/wupeiqi/p/4766801.html

python—面向对象编程的更多相关文章

  1. python 面向对象编程学习

    1. 问题:将所有代码放入一个py文件:无法维护 方案:如果将代码才分放到多个py文件,好处: 1. 同一个名字的变量互相不影响 2.易于维护 3.引用模块: import module 2.包:解决 ...

  2. python 面向对象编程(一)

    一.如何定义一个类 在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法. 类是对现实世界中一些事物的封装,定义一个类可以采用下面的方式来定义: class c ...

  3. Python面向对象编程指南

    Python面向对象编程指南(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1SbD4gum4yGcUruH9icTPCQ 提取码:fzk5 复制这段内容后打开百度网 ...

  4. python面向对象编程进阶

    python面向对象编程进阶 一.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 ...

  5. Python面向对象编程(下)

    本文主要通过几个实例介绍Python面向对象编程中的封装.继承.多态三大特性. 封装性 我们还是继续来看下上文中的例子,使用Student类创建一个对象,并修改对象的属性.代码如下: #-*- cod ...

  6. Python 面向对象编程——访问限制

    <无访问限制的对象> 在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑.但是,从前面Student类的定义来看(见:Py ...

  7. Python 面向对象编程 继承 和多态

    Python 面向对象编程 继承 和多态 一:多继承性 对于java我们熟悉的是一个类只能继承一个父类:但是对于C++ 一个子类可以有多个父亲,同样对于 Python一个类也可以有多个父亲 格式: c ...

  8. Python 面向对象编程基础

    Python 面向对象编程基础 虽然Pthon是解释性语言,但是Pthon可以进行面向对象开发,小到 脚本程序,大到3D游戏,Python都可以做到. 一类: 语法: class 类名: 类属性,方法 ...

  9. python面向对象编程学习

    python面向对象编程 基本概念理解 面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作 ...

  10. Python面向对象编程——继承与派生

    Python面向对象编程--继承与派生 一.初始继承 1.什么是继承 继承指的是类与类之间的关系,是一种什么"是"什么的关系,继承的功能之一就是用来解决代码重用问题. 继承是一种创 ...

随机推荐

  1. js动态获取当前系统时间+js字符串转换为date日期对象

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  2. cmd 一键获取 所有连接过的wifi 密码

    for /f "skip=9 tokens=1,2 delims=:" %i in ('netsh wlan show profiles') do @echo %j | finds ...

  3. phpmyadmin任意文件包含漏洞分析(含演示)

    0x01 漏洞描述 phpmyadmin是一款应用非常广泛的mysql数据库管理软件,基于PHP开发. 最新的CVE-2014-8959公告中,提到该程序多个版本存在任意文件包含漏洞,影响版本如下: ...

  4. Xstream(对象和xml转换)

    package com.vcredit.framework.utils; import java.io.Writer; import org.apache.commons.lang3.StringUt ...

  5. 设置mariadb字符集为utf8

    我用的是10.0.25 mariadb,     在centos7系统上,用以下指令设置数据库字符集. [client] default-character-set=utf8 [mysql] defa ...

  6. Web前端开发基础 第四课(CSS小技巧)

    水平居中设置-行内元素 我们在实际工作中常会遇到需要设置水平居中场景,今天我们就来看看怎么设置水平居中的. 如果被设置元素为文本.图片等行内元素时,水平居中是通过给父元素设置 text-align:c ...

  7. vi/vim初步接触

    vi和vim一直被人津津乐道,到底是什么使得它们如此受欢迎? vi分为3种模式:一般模式,编辑模式,命令行模式. (1)一般模式: 进入vi后,默认就是一般模式. 用处:方便地移动光标,删除字符/整行 ...

  8. Android课程---布局管理器之相对布局(二)

    这次示例代码是相对布局中兄弟组件之间,设置按钮的位置,难度:*****,一定要注意有同方向和反方向之分: 1.同方向 1)layout_alignLeft 同方向左对齐 2)layout_alignR ...

  9. ios-改变button四个角的弧度

    -(void)createTitleView{ UIView * backview = [[UIView alloc]init]; backview.frame =CGRectMake(87*kHei ...

  10. C#编程利器之三:接口(Interface)【转】

    C#编程利器之三:接口(Interface) C#接口是一个让很多初学者容易迷糊的东西,用起来好象很简单,定义接口,然后在里面定义方法,通过继承与他的子类来完成具体的实现.但没有真正认识接口的作用的时 ...