python—面向对象编程

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

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

首先创建一个类

#使用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)
#执行结果:
#name:zhangsan,age:18
#name:lisi,age: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

时间: 2024-08-08 17:14:27

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

Python面向对象编程-封装

1引言 你点击了桌面上的Chrome图标,一个浏览器窗口出现了,输入网址就可以在Internet世界愉快玩耍.这一切是怎么实现的呢?Chromium这个多进程的程序是如何启动各个进程的呢?浏览器主进程(界面进程)启动了哪些线程?如何启动的呢?这些问题一直萦绕在心头,一起来看看源代码吧.本文主要针对Chromium for Mac的源代码,其它操作系统大同小异. 2背景知识 浏览器作为一个应用程序,是以进程的形式运行在操作系统上的.首先,Chromium是一个多进程的应用程序,我们需要了解Chro

(转)Python 面向对象编程(一)

Python 面向对象编程(一) 虽然Python是解释性语言,但是它是面向对象的,能够进行对象编程.下面就来了解一下如何在Python中进行对象编程. 一.如何定义一个类 在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法. 类是对现实世界中一些事物的封装,定义一个类可以采用下面的方式来定义: class className: block 注意类名后面有个冒号,在block块里面就可以定义属性和方法了.当一个类定义完之后,就产生了一个类对象.类对象支持

python 面向对象编程(一)

一.如何定义一个类 在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法. 类是对现实世界中一些事物的封装,定义一个类可以采用下面的方式来定义: class className: block 注意类名后面有个冒号,在block块里面就可以定义属性和方法了.当一个类定义完之后,就产生了一个类对象.类对象支持两种操作:引用和实例化.引用操作是通过类对象去调用类中的属性或者方法,而实例化是产生出一个类对象的实例,称作实例对象.比如定义了一个people类: cl

Python面向对象编程总结(上)

在我学习python之前一直认为python是脚本型语言,不能用面相对象的方法进行编程,当我学习了python之后我发现我错了,python不但支持面相对象而且使用的人还挺多的.我从接触编程开始就是学习的Java语言,所以面相对象编程的思想在我的脑海里根深蒂固,让我一下从面向对象编程转换到面向过程编程还有一些不适应呢,所以我就来总结一下python面向对象编程的方法和过程.我将按照面向对象的构成要素来分析,依次为类和实例.属性.方法.封装.继承.多态,如果有什么问题还请大家积极指出,我所用的版本

python面向对象编程(OOP)

python作为一种解释性语言,其主要的编程方式就是面向对象,而且python的框架django也是主要面向对象的编程. 类(class)和对象(object) 类(class)是用来描述具有相同属性(attribute)和方法(method)对象的集合.对象(object)是类(class)的实例.比如学生都有名字和分数,他们有着共同的属性.这时我们就可以设计一个学生类,用来记录学生的名字和分数,并自定义打印出来. 属性(attribute):类里面用于描述所有对象共同特征的变量或数据.比如此

Python面向对象编程指南(高清版)PDF

Python面向对象编程指南(高清版)PDF百度网盘链接:https://pan.baidu.com/s/1SbD4gum4yGcUruH9icTPCQ 提取码:fzk5 复制这段内容后打开百度网盘手机App,操作更方便哦内容简介 · · · · · · Python是一种面向对象.解释型的程序设计语言,它已经被成功应用于科学计算.数据分析以及游戏开发等诸多领域.本书深入介绍Python语言的面向对象特性,全书分3个部分共18章.第1部分讲述用特殊方法实现Python风格的类,分别介绍了init

python面向对象编程进阶

python面向对象编程进阶 一.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 class Foo(object): 2 pass 3 4 obj = Foo() 5 6 isinstance(obj, Foo) issubclass(sub, super)检查sub类是否是 super 类的派生类 1 class Foo(object): 2 pass 3 4 class B

Python面向对象编程——简介

Python面向对象编程--简介 编程范式 编程是程序员用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程 . 一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大路通罗马,实现一个任务的方式有很多种不同的方式, 对这些不同的编程方式的特点进行归纳总结得出来的编程方式类别,即为编程范式. 不同的编程范式本质上代表对各种类型的任务采取的不同的解决问题的思路, 大多数语言只支持一种编程范式,当然也有些语言可以同时支持多种编程范式. 两种最重要的编程范式分别是面向

python面向对象编程

java和c#只支持面向对象编程,python即可支持面向对象也可以支持函数式编程. 面向对象两个重要的概念:  1.类 2.对象 函数式 def sendemail(email,msg):            函数 print("8888") 面向对象 class Myclass: def sendmail(self,email,msg):      函数定义在类中第一个参数必须是self print("8888")              函数在类中定义叫方

Python面向对象编程(二)

本文转自博客园海子的文章http://www.cnblogs.com/dolphin0520/archive/2013/03/29/2986924.html 再次发出感谢海子的分享,本人阅读了多次,受益匪浅! 在前面一篇文章中谈到了类的基本定义和使用方法,这只体现了面向对象编程的三大特点之一:封装. 下面就来了解一下另外两大特征:继承和多态. 在Python中,如果需要的话,可以让一个类去继承一个类,被继承的类称为父类或者超类.也可以称作基类,继承的类称为子类.并且Python支持多继承,能够让