对于面向对象的部分详解

面向对象部分详解如下:

一、面向对象

什么是面向对象?

面向对象与面向过程相比:

面向过程:其核心就是过程,过程指的是解决问题的步骤,如先干什么再干什么就好像是一条流水线;该思维方式编程被称为机械式的编程思维。

面向过程的优点:复杂的问题流程化进而流程化

面向过程的缺点:扩展性差(改一个地方其他的地方也必须更改)

面向对象:其核心就是对象,对象指的是特征与功能的结合体,在Python3中世间万物都是对象或在上帝眼里世间万物都是对象即使没有的对象也可以创造出来,这种思维方式被称为上帝式的编程思维。

面向对象的优点:扩展性强

面向对象的缺点:编程的复杂度远高于面向过程

二、类

1、什么是类?

类:指的是一系列具有对象相同特征与功能的结合体

对象:指的是具有特征与功能的结合体

补充:在使用类的时候会产生一个名称空间专门存放具有相同特征与功能结合体,在产生对象的时候会产生一个名称空间专门

用来存放其特有的特征与功能的结合体。

了解:在现实世界中先有对象然后再通过对象总结出类这个概念,但是在程序中必须先定义类然后再通过类来产生对象。

类的举例如下:

class foo:
    x=11
    def __init__(self,name):
        self.name=name
    def f(self):
        print(‘f‘)
    print(‘11‘)

调用类产生的对象的例子如下:

obj=foo()
obj.f()

注意:1、在类中任意的Python代码在定义阶段就执行了

2、在__init__中的代码是没有返回值的

三、继承

1、什么是继承?
继承:指的是表示新建的类的方式。新建的类被称为子类或派生类,被继承的类称之为父类或基类或超类。

继承的三大特点:

    1、子类可以遗传或重用父类(可以用来解决类与类之间的代码冗余)

    2、一个子类可以继承多个父类

    3、在继承的背景下Python中类可以分为两种:

      新式类:但凡含有object的类与其子子孙孙都是新式类。

          注意:在python2中需要自己声明object

      经典类:没有object的类其子子孙孙都是经典类。

2、为何要用继承?

是为了解决类与类之间的代码冗余。

3、如何去用继承?

class Foo:
    def f(self):
        print(‘foo_f‘)
class Bar(Foo):
    def f1(self):
        print(‘bar_f1‘)
obj=Bar()
obj.f()

4、派生类新方法中重用父类的两个方式
方式一:指名道姓

其特点:1、跟继承无关2、访问的是类中的函数且没有自动传值的效果

例子如下:

class people:
    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex
class student(people):
    def __init__(self,name,age,sex,score):
        people.__init__(self,name,age,sex)
        self.score=score
    def scored(self):
        print(‘score‘)
obj=student(‘liu‘,18,‘male‘)
obj.scored()

方式二:super()在python2中其括号内必须传入(类的 名字,类的对象)
其特点:1、严格依赖继承mro列表 2、访问的是绑定方法并且有自动传值的效果

例子如下:

class people:
    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex
class student(people):
    def __init__(self,name,age,sex,score):
        super().__init__(name,age,sex)
        self.score=score
    def scored(self):
        print(‘score‘)
obj=student(‘liu‘,18,‘male‘)
obj.scored()

5、属性查找顺序
单继承:对象本身-》对象的类-》父类-》父类-》..

多继承:对象本身-》对象的类-》将括号内的按从左到右的顺序查找下去

菱形继承问题的查找方式如下:

新式类:广度优先查找:按照顺序从左到右一个分支一个分支的查找下去,最后一个分支查找顶级类

经典类:深度优先查找:按照顺序从左到右一个分支一个分支的查找下去,第一个分支查找顶级类

补充:在查找新式类时要按照mro列表去查看继承关系如(print(obj.mro()去看对象的mro列表)。

四、组合

1、什么是组合?

组合:指的是某一个类所拥有的属性的值是另一个类的对象

2、为何要用组合?

是为了通过为某一个类添加属性的方式将其关联或组合起来从而达到减少类与类之间的代码冗余。

3、如何去用组合?

例子如下:

class People:
    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex
class Student(People):
    def __init__(self,name,age,sex,score):
        super().__init__(name,age,sex)
        self.score=score
        self.coursed=[]
    def scored(self):
        print(‘score‘)
class Course:
    def __init__(self,cname,cproice,cprioed):
        self.cname=cname
        self.cproice=cproice
        self.cprioed=cprioed
    def tell_info(self):
        print(‘课程名:%s花费:%s周期:%s‘%(self.cname,self.cproice,self.cprioed))
stu=Student(‘liu‘,18,‘male‘)
python=Course(‘python‘,1200,5)
stu.coursed.append(python)

五、多态与多态性
1、什么是多态?

多态:指的是同一类或同一事物的不同形态。

2、为何用多态?

在多态性下可以在无需声明类的类型下去使用多态

多态的精髓是:统一

3、如何用多态?

举例如下:

import abc
class Animal(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def speak(self):
        print(‘animal‘)
class People(Animal):
    def shuo(self):
        print(‘people‘)
class Dog(Animal):
    def sound(self):
        print(‘dog‘)
Dog.speak()
People.speak()

补充:在多态里使用import abc模块可以强制子类与父类统一,但是也可以在编写的时候就写一样的。

六、封装

1、什么是封装?

封:将名称空间或容器中的名字隐藏起来,这种隐藏对外不对内

装:将名字放入名称空间或容器

2、如何去用?

在属性前加__开头:

封装的三大特点:

1、__开头并不是真正意义上的改变外形且不会真正的限制外部的访问(可以在类中加一个接口用来外部访问)

class Foo:
    __x=111 # _Foo__x
    __y=222 # _Foo__y

    def __init__(self,name,age):
        self.__name=name
        self.__age=age

    def __func(self): #_Foo__func
        print(‘func‘)

    def get_info(self):
        print(self.__name,self.__age,self.__x) #print(self._Foo__name,self._Foo__age,self._Foo__x)

obj=Foo(‘egon‘,18)
obj.get_info()    

2、__开头只是在类定义阶段改变类中的外形,在类定义阶段后不再改变外形。

3、如果父类不想让子类去覆盖自己的属性可以在属性前加__开头。

class foo:
    def f1(self):
        print(‘foo_f1‘)
        self.__f2()
    def __f2(self):
        print(‘foo_f2‘)
class bar(foo):
    def __f2(self):
        print(‘bar_f2‘)
obj=bar()
obj.f1()

七、property装饰器
property装饰器可以将函数属性伪装成数据属性

例子如下:

class bmi:
    def __init__(self,height,weight):
        self.height=height
        self.weight=weight
    @property
    def bb(self):
        return self.weight/(self.height**2)
obj=bmi(1.72,58)
print(obj.bb)

八、绑定与非绑定
绑定方法:(绑定给谁就由谁来调用,谁来调用就将谁当做第一个参数传入)

绑定类的方法:用装饰器@classmethod

@classmeoth

  类.boud_method()

(具有自动传参的效果)

绑定对象的方法:没有装饰器

对象.boud_method()

(具有自动传参的效果)

非绑定的方法:用装饰器@staticmethod

不与类或对象绑定,用类或对象都可以调用并且其没有传值的说法。

注意:要与绑定到对象的方法区分开,在类中直接定义的函数没有被任何装饰器装饰的都是绑定对象的方法并且可以自动传值,而用staticmethod装饰的方法不管是类还是对象都没有自动传值的说法。

举例如下:

class foo:
    def f1(self):
        print(‘f1‘)
    @classmethod
    def f2(self):
        print(‘f2‘)
    @staticmethod
    def f3(self):
        print(‘f3‘)
obj=foo()
obj.f1() #绑定到对象
foo.f2()
obj.f2()#绑定到类
foo.f3(1)
obj.f3(1)#非绑定

原文地址:https://www.cnblogs.com/ageliu/p/9517093.html

时间: 2024-10-16 23:55:12

对于面向对象的部分详解的相关文章

Java面向对象之异常详解

目录 Java面向对象之异常[一] Java面向对象之异常[二] 捕获异常的规则 访问异常信息 异常对方法重写的影响 finally详解 Java面向对象之异常[一] Java面向对象之异常[二] 往期回顾:上一篇我们大致总结了异常的继承体系,说明了Exception和Error两个大类都继承于顶级父类Throwable,又谈到编译时异常与运行时异常的区别,谈到异常的处理方式,以及处理方式中关于捕获方式的几种类型. 本篇承上启下,将从异常的其余部分进行总结,但是毕竟现在处于初学阶段,未必能够体会

面向对象的概念详解(转)

OOP:面向对象编程,一提到面向对象,大家可能就想到类,接口.一说特性,大家可能张口就来:继承.封装.多态,那么到底什么样的对象(类)才是真正意义上的对象呢?特别是现在流行的DDD领域驱动设计思想,讲究职责划分,那么如何定义一个对象(类)它应该具有的一些特性.行为方法及承担责任成为关键. 一个看似简单的问题,其实也是耐人思索,之前也在网上看到一些人关于讨论类的设计问题,认为设计类时不应该考虑数据库,我觉得这只是实现真正的面向对象设计的基础,也是前提条件,大多数程序员之前都是受面向过程编程思想的影

javascript 特殊的面向对象以及继承详解(入门篇)

学习Javascript人,大多听说一句话叫js里面一切都是对象.我刚开始接触javascript面向对象编程时候,挺乱的,我当时习惯性的把PHP的面像对象思想套用在js上面,其实js的面向对象与传统的面向对象还是有很多区别的.这里就不再去讲解基础的面向对象是什么了,看这篇文章就默认大家都知道面向对象的概念. 首先,在目前的js版本中,依然没有引入class这个关键词,js里面没有类的概念,其他语言在实例化一个对象的时候,都是使用new 类名来得到实例,而js由于没有class,因此它的面向对象

面向对象 & 接口 & 抽象类 详解

面向对象 什么是面向对象 为什么要使用面向对象 面向对象的特性 面向对象的缺点 面向对象的原则 其他编程范式 接口和抽象类 接口和多重继承 接口和抽象类 面向接口编程 原文地址:https://www.cnblogs.com/amei0/p/8600415.html

JavaScript中的面向对象编程,详解原型对象及prototype,constructor,proto,内含面向对象编程详细案例(烟花案例)

面向对象编程: 面向:以什么为主,基于什么模式 对象:由键值对组成,可以用来描述事物,存储数据的一种数据格式 编程:使用代码解决需求 面向过程编程: 按照我们分析好的步骤,按步骤解决问题 优点:性能比面向对象高,适合跟硬件联系很紧密的东西 缺点:没有面向对象那么容易维护,复用,扩展 面向对象编程: 把事务分解成一个个对象,然后由对象之间分工与合作,分工明确,每一个对象都是功能中心 面向对象特性:封装性.继承性 .多态性 封装性:将一个功能封装起来,小封装 将多个函数封装起来,整体封装起来形成一个

Java学习系列(二十三)Java面向对象之内部类详解

一.前言 内部类也称寄生类,就是把一个类放在类里面(即内部类的上一级程序单元是类)定义,将其作为外部类的成员.内部类主要用几种定义形式:静态(static)内部类,非静态内部类,匿名内部类(也就是没有名字的寄生类).内部类的好处就是内部类可以直接外部类的(包括私有)成员,反之不能.下面我们通过一些实例来详细讲解一下Java中内部类的使用及几种定义形式的相互调用. 二.实例说明 (1)匿名内部类:当程序创建匿名内部类时,会立即创建匿名内部类(实现类)的实例. interface IBreathe

Java学习系列(二十)Java面向对象之反射详解

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/45289391 前言 今天讲讲Java中的反射.我们常见的反射多用于JDBC中的加载驱动程序Class.forName("com.mysql.jdbc.Driver");.Struts的MVC.Hibernate中的ORM.Spring中的IOC还有一些其他框架等等.那它有什么好处呢?它的好处就是能够动态的创建对象和编译且能够访问某个类中的所有(包括私有)属性方法及对象的属性方法

Java学习系列(二十一)Java面向对象之注解详解

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/45295947 一.前言 Java中的注解Annotation运用到很多方面,比如之前讲的单元测试中的@Test.Spring.SpringMVC还有其他框架等等.Java本身自带的注解也有一些,比如:@Override(子类要重写/覆写父类的对应方法).@Deprecated(表示方法不建议被使用).@SuppressWarnings(抑制警告)等等.当然,我们也可以自定义一些自己需要的

JAVA 面向对象之方法详解

本页面更新日期: 2016年07月18日 前言 方法是类或对象 的行为特征的抽象. 方法是类或对象最重要的组成部分. 所有的方法都必需定义在类里. 方法不能独立存在. 方法在逻辑上要么属于类, 要么属于对象. 方法的所属性 一旦将一个方法定义在某个类的类体内. 如果这个方法使用了static修饰符,则这个方法属于这个类. 否则这个方法属于这个类的实例. Java语言是静态的. 一个类定义完成后,只要不再重新编译这个类文件,该类和该类的对象所拥有的方法是固定的,永远都不会改变. 执行方法时必需使用