首页 > 编程语言 > 详细

python面向对象

时间:2019-11-12 14:22:22      阅读:89      评论:0      收藏:0      [点我收藏+]

简介

面向对象,是很多高级语言的一种特性,与之相对的是的面向过程的语言,比如c 。网上有很多大牛对这块做详解,我这个小白就不阐述了。

 

面向对象涉及方面

既然要使用面向对象,首先我们要知道面向对象写法涉及哪些内容,要学习哪些概念,具体有以下几种

  • 类(class):用来定义类的,也是描述具有相同属性和方法的对象的集合,它定了该集合中每个对象所共有的属性和方法,对象是类的实例
  • 类变量:类变量在整个实例化的对象中是公用的,类变量定义在类中且在函数体之外,类变量通常不作为实例变量使用
  • 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据
  • 方法重写:定义在方法中的变量,只作用于当前实例的类
  • 继承:即一个派生类,继承基类的字段和方法,继承也允许把一个派生类的对象作为一个基类对象对待,例如:有一个设计,一个dog类型的对象派生自any类,那么dog也是any类
  • 实例化:创建一个类的实例,类的具体对象,就是我们写完一个类时,它是虚拟的,不存在的,只有当我们用这个类去定义一个变量时(实例)才能进行使用。
  • 方法:类中定义的函数
  • 对象:通过类定义的数据结构实例,对象包括连个数据成员(类变量和实例变量)和方法

 

简单类的定义

"""
    类的定义
"""

class human():   # 这是一个表示人的类
    """
        这是一个表示人的类,那么它里面就应该有人能做的各种操作
    """
    def sj(self):   # self为必填项,每个方法都要填的,不填就会报错
        print("这个人能够睡觉")

    def cf(self):
        print("这个人能够吃法")

    def pb(self):
        print("这个人能跑步")

join = human()   # 这里我用表示人的类定义了一个叫join的人
join.sj()        # join可以睡觉
join.pb()        # join可以跑步
join.cf()        # join可以吃饭

 

类的构造

"""
    类的定义
"""
class human():   # 这是一个表示人的类
    """
        这是一个表示人的类,那么它里面就应该有人能做的各种操作
    """
    def __init__(self,name,sex,age):   # 这是一个语法,构造函数,用来生成这个类的基本属性
        self.name = name
        self.sex = sex
        self.age = age
    """
        这里的self.age可以理解为这个类本身的基本属性,而右边的
        age,没有意义,只是外面传来的一个数据,这里的写法可以想
        象成我们给这个self(指这个类,可以想成一个人)给了一个名字
        ,然后又给了姓名,最后给了年龄
    """
    
    def agee(self):
        print(self.age)
    
cheney = human("cheney","男",14)  # 给这个对象进行初始化
cheney.agee()                     # 打印出这个人的年龄

 

简单练习

练习一:游戏人生程序

1、创建三个游戏人物,分别是:

  • 苍井井,女,18,初始战斗力1000
  • 东尼木木,男,20,初始战斗力1800
  • 波多多,女,19,初始战斗力2500

2、游戏场景,分别:

  • 草丛战斗,消耗200战斗力
  • 自我修炼,增长100战斗力
  • 多人游戏,消耗500战斗力
class human():
    def __init__(self,name,sex,age,sword):
        self.name = name
        self.sex = sex
        self.age = age
        self.sword = sword
    
    def hassock(self):
        """草丛战斗,消耗200战力"""
        self.sword = self.sword - 200
        print("{}进行了草丛战斗,减少200战力".format(self.name))

    def practice(self):
        """自我修炼,增长100战力"""
        self.sword = self.sword + 100
        print("{}进行了自我修炼,增加了100战力".format(self.name))

    def playgame(self):
        """多人游戏,消耗200战力"""
        self.sword = self.sword - 500
        print("{}进行了多人游戏,减少了500战力".format(self.name))
    
    def show(self):
        """详情显示"""
        print("姓名:{}".format(self.name))
        print("性别:{}".format(self.sex))
        print("年龄:{}".format(self.age))
        print("战力:{}".format(self.sword))

A = human(‘苍井井‘,‘女‘,18,1000)
B = human(‘东尼木木‘,‘男‘,20,1800)
C = human(‘波多多‘,‘女‘,19,2500)

A.playgame()
A.practice()
A.show()

B.hassock()
B.show()

C.playgame()
C.show()

 

类的继承(子类与父类)

class AI1():   # 这个是父类,没有这个型号的AI就没有其他型号的AI
    """
        因为这里AI1是其他AI的最基础的一代,所以它会的只有这两项,但同时
        其他AI都是此基础的加强,所以都继承了这一代AI的所有特性,并向这不
        同方向在发展,AI2是家用型,AI3是侦察兵,这里的self.name是其他型
        号调用才能进行显示,因为第一代AI没有给出构造的名字,所有没有名字
        显示,如果构造进行打印,这里会出错。
    """
    def boxing(self):
        print("{}会拳击".format(self.name))

    def grapple(self):
        print("{}会格斗".format(self.name))

class AI2(AI1):  # 子类
    def __init__(self,name):
        self.name = name

    def rice(self):
        print("{}会做饭".format(self.name))

    def smart(self):
        print("{}有点帅".format(self.name))

class AI3(AI1):  # 子类
    def __init__(self,name):
        self.name = name

    def spy(self):
        print("{}会侦查".format(self.name))

    def hide(self):
        print("{}会隐藏".format(self.name))

    def spear(self):
        print("{}会枪械".format(self.name))

A = AI2("T-200")
B = AI3("T-500")
# C = AI1()
# C.boxing()  这里是错误的写法

A.rice()
A.boxing()
A.grapple()

B.boxing()
B.grapple()
B.spear()

 

多继承

上面我们学习了单继承

那么问题来了,多继承呢?

  • 是否可以继承多个类?
  • 如果继承的多个类每个类中都定了相同的函数,那么哪一个会被使用呢?

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

2、Python的类如果继承了多个类,那么其寻找方法的方式有两种,分别是:深度优先广度优先

深度优先:在A中如果我们要寻找test()这个函数,那么它的查询规则则是,先从A中查询有没有,再从B中查询有没有,然后在D中查询有没有,最后在C中查询有没有

广度优先:在下图中可以直观的看到是以层级展开查找的,如果A后面还有子类E,那么第4个查找就是这个E

技术分享图片

  • 当类是经典类时,多继承的情况下,会按照深度优先方式查找
  • 当类是新式类时,多继承情况下,会按照广度优先方式查找

经典类和新式类,从字面上可以看出一个老一个新,新的必然包括了更多的功能,也是之后推荐的写法,从写法上区分的话,如果当前类或者父类继承了object类,那么该类便是新式类,否则便是经典类

技术分享图片

 

深度优先(经典):当调用A类test函数时,如下图所示,先查找A类中有无test函数,再查找B类,再查找D类,最后查找C类。

技术分享图片

class D():
    def test(self):
        print("D")

class C(D):
    def test(self):
        print("C")

class B(D):
    def test(self):
        print("B")

class A(B,C):
    def test(self):
        print("A")

a=A()
a.test()

广度优先(新式):当调用A类test函数时,如下图所示,先查找A类有无test函数,再查找B类,再查找C类,最后查找D类。

技术分享图片

区别:深度优先和广度优先只是查找的顺序变了

  • Python2中带object的叫经典类,不带object的叫新式类,但是在Python3中取消了这一特性,所有的类默认为新式类
  • 加了object有很多好处,平时写程序时,如果你使用的是Python2,不妨加上object,养成好习惯

 

多态

class human():
    def __init__(self,name,sex):
        self.name = name
        self.sex = sex
    
    def show(self):
        print("姓名:{}".format(self.name))
        print("性别:{}".format(self.sex))

class person(human):
    def show(self):
        print("性别:{}".format(self.sex))
        print("姓名:{}".format(self.name))

AI = person("cheney",‘男‘)
AI.show()

    多态的好处是,当我们传入更多的子类时,我们只需要继承human就行,而show函数可以重写,也可以不重写,也可以重写一个特有的,这就是多态,调用方只管调用,不管细节,而我们新增一个human子类时,只要确保新方法编写正确,而不用管原来的代码,这就是著名的“开闭原则”:

  • 对扩展开发:允许子类重写方法函数
  • 对修改封闭:不重写,直接继承父类方法函数

 

总结

  • 以上就是全部我对于Python面向对象的理解,总结如下:
  • 面向对象是另一种编程思想,相对于面向过程的编程思想,它更灵活多变,具体要把我类和对象的概念,就是把抽象的东西具体化
  • 类中的所有事物都是以方法函数的形式存活,不像过程那样先做什么后做什么,类就是一个实例,就是一个物体,里面的所有方法,都是它的属性和可以做的事情
  • 面向对象有三大特征:封装,集成和多态

 

借鉴参考:https://www.cnblogs.com/chengd/articles/7287528.html

python面向对象

原文:https://www.cnblogs.com/cheneyboon/p/11839169.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!