2018-01-16 Python面向对象基础(一)

官网原文链接:
https://docs.python.org/3/tutorial/classes.html#a-word-about-names-and-objects

面向对象的三大特性:继承,封装,多态
多继承需要注意的点:

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

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

image.png

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

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

经典类多继承

class D:

    def bar(self):
        print 'D.bar'


class C(D):

    def bar(self):
        print 'C.bar'


class B(D):

    def bar(self):
        print 'B.bar'


class A(B, C):

    def bar(self):
        print 'A.bar'

a = A()
# 执行bar方法时
# 首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去D类中找,如果D类中么有,则继续去C类中找,如果还是未找到,则报错
# 所以,查找顺序:A --> B --> D --> C
# 在上述查找bar方法的过程中,一旦找到,则寻找过程立即中断,便不会再继续找了
a.bar()

新式类多继承

class D(object):

    def bar(self):
        print 'D.bar'


class C(D):

    def bar(self):
        print 'C.bar'


class B(D):

    def bar(self):
        print 'B.bar'


class A(B, C):

    def bar(self):
        print 'A.bar'

a = A()
# 执行bar方法时
# 首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去C类中找,如果C类中么有,则继续去D类中找,如果还是未找到,则报错
# 所以,查找顺序:A --> B --> C --> D
# 在上述查找bar方法的过程中,一旦找到,则寻找过程立即中断,便不会再继续找了
a.bar()

解释:
经典类:首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去D类中找,如果D类中么有,则继续去C类中找,如果还是未找到,则报错

新式类:首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去C类中找,如果C类中么有,则继续去D类中找,如果还是未找到,则报错

注意:在上述查找过程中,一旦找到,则寻找过程立即中断,便不会再继续找了

面向对象的应用:
所以,一般在Python开发中,全部使用面向对象 或 面向对象和函数式混合使用。

组合

软件重用的重要方式除了继承之外还有另外一种方式,即:组合

组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合

class Equip(object):
    def fire(self):
        print('release Fire skill')

class Riven:
    camp = "Noxus"

    def __init__(self,nickname):
        self.nickname = nickname
        self.equip = Equip()   ##Riven类的对象调用该方法时,将会产生一个Equip对象
r1 = Riven('瑞雯雯')
r1.equip.fire()  #release Fire skill

组合与继承的区别:

1、继承是建立了派生类与基类间的关系,它是一种‘是’的关系,比如人是动物。
2、组合是建立了类与组合的类之间的关系,它是一种‘有’的关系,比如教师有生日,教师教Python和Linux课程。

抽象类

与Java一样,Python也有抽象类的概念,但是同样需要模块实现,抽象类是一个特殊的类,他的特殊之处在于只能被继承,不能被实例化。

from abc import ABCMeta,abstractclassmethod

class Foo(metaclass=ABCMeta):  ##不能被实例化,只能被继承

    @abstractclassmethod
    def method1(self):
        pass


class Bar(Foo):

    def method1(self):  ###必须要实现父类Foo的方法method1
        print('.....')


Bar().method1()

#######################类中的方法########################


class A(object):
    def __init__(self):
        pass

    def func(self):
        return self


print(A().func)  # <bound method A.func of <__main__.A object at 0x00000228952372E8>>

print(A().func()) # None

print(A.func) # <function A.func at 0x000001B56FE9FA60>

print(A.func(A())) # None
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 作者:武沛齐原文出处:http://www.cnblogs.com/wupeiqi/ 概述 面向过程:根据业务逻辑...
    IT程序狮阅读 4,425评论 1 29
  • 一、面向对象,这个对象到底是什么? 这个对象不是python中的实例,python中我们把一个类的实例也叫做对象,...
    youngkun阅读 4,612评论 0 2
  • @(python)[笔记] 目录 前言 在python中,一切皆对象面向对象的程序设计的核心就是对象;面向对象的程...
    CaiGuangyin阅读 3,730评论 0 5
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 33,182评论 18 399
  • 2017年5月31日,迎着骄阳,水榭花城社区暨格林贝尔幼儿园举办了庆六一文艺演出活动。小朋友们,老师们和家长们的热...
    水榭花城社区阅读 2,256评论 0 0

友情链接更多精彩内容