面向对象编程(代码片段)

dongye95 dongye95     2022-11-12     305

关键词:

创建类和对象

 

面向对象编程是一种编程方式,此编程方式的落地需要使用 “类” 和 “对象” 来实现,所以,面向对象编程其实就是对 “类” 和 “对象” 的使用。

类:就是一个模板,模板里可以包含多个函数,函数里实现一些功能

对象:则是根据模板创建的实例,通过实例对象可以执行类中的函数

技术分享图片

# 创建类
class Foo:
     
    def Bar(self):
        print Bar
 
    def Hello(self, name):
        print i am %s %name
 
# 根据类Foo创建对象obj
obj = Foo()
obj.Bar()            #执行Bar方法
obj.Hello(dongye) #执行Hello方法 

面向对象三大特性

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

一、封装

封装,顾名思义就是将内容封装到某个地方,以后再去调用被封装在某处的内容。

所以,在使用面向对象的封装特性时,需要:

  • 将内容封装到某处
  • 从某处调用被封装的内容

第一步:将内容封装到某处

技术分享图片

 self 是一个形式参数,当执行 obj1 = Foo(‘wupeiqi‘, 18 ) 时,self 等于 obj1

                              当执行 obj2 = Foo(‘alex‘, 78 ) 时,self 等于 obj2

所以,内容其实被封装到了对象 obj1 和 obj2 中,每个对象中都有 name 和 age 属性,在内存里类似于下图来保存。

技术分享图片

第二步:从某处调用被封装的内容

调用被封装的内容时,有两种情况:

  • 通过对象直接调用
  • 通过self间接调用

1、通过对象直接调用被封装的内容

上图展示了对象 obj1 和 obj2 在内存中保存的方式,根据保存格式可以如此调用被封装的内容:对象.属性名。

class Foo:
 
    def __init__(self, name, age):
        self.name = name
        self.age = age
 
obj1 = Foo(dongye, 18)
print(obj1.name)    # 直接调用obj1对象的name属性
print(obj1.age)     # 直接调用obj1对象的age属性
 
obj2 = Foo(bieren, 82)
print(obj2.name)    # 直接调用obj2对象的name属性
print(obj2.age)     # 直接调用obj2对象的age属性

2、通过self间接调用被封装的内容

执行类中的方法时,需要通过self间接调用被封装的内容。

class Foo:
  
    def __init__(self, name, age):
        self.name = name
        self.age = age
  
    def detail(self):
        print(self.name)
        print(self.age)
  
obj1 = Foo(dongye, 18)
obj1.detail()  # Python默认会将obj1传给self参数,即:obj1.detail(obj1),所以,此时方法内部的 self = obj1,即:self.name 是 dongye;self.age 是 18
  
obj2 = Foo(bieren, 82)
obj2.detail()  # Python默认会将obj2传给self参数,即:obj1.detail(obj2),所以,此时方法内部的 self = obj2,即:self.name 是 bieren; self.age 是 82

 

 综上所述,对于面向对象的封装来说,其实就是使用构造方法将内容封装到 对象 中,然后通过对象直接或者self间接获取被封装的内容。

二、继承

继承:面向对象中的继承和现实生活中的继承相同,即:子可以继承父的内容。

class Animal:

    def eat(self):
        print "%s 吃 " %self.name

    def drink(self):
        print "%s 喝 " %self.name

    def shit(self):
        print "%s 拉 " %self.name

    def pee(self):
        print "%s 撒 " %self.name


class Cat(Animal):

    def __init__(self, name):
        self.name = name
        self.breed = 

    def cry(self):
        print 喵喵叫

class Dog(Animal):
    
    def __init__(self, name):
        self.name = name
        self.breed = 
        
    def cry(self):
        print 汪汪叫
        

# ######### 执行 #########

c1 = Cat(小白家的小黑猫)
c1.eat()

c2 = Cat(小黑的小白猫)
c2.drink()

d1 = Dog(胖子家的小瘦狗)
d1.eat()

所以,对于面向对象的继承来说,其实就是将多个类共有的方法提取到父类中,子类仅需继承父类而不必一一实现每个方法。

三、多继承

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

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

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

经典类和新式类

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

技术分享图片 技术分享图片

 

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

技术分享图片

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

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

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

技术分享图片
 1 class D:
 2 
 3     def bar(self):
 4         print D.bar
 5 
 6 
 7 class C(D):
 8 
 9     def bar(self):
10         print C.bar
11 
12 
13 class B(D):
14 
15     def bar(self):
16         print B.bar
17 
18 
19 class A(B, C):
20 
21     def bar(self):
22         print A.bar
23 
24 a = A()
25 # 执行bar方法时
26 # 首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去D类中找,如果D类中么有,则继续去C类中找,如果还是未找到,则报错
27 # 所以,查找顺序:A --> B --> D --> C
28 # 在上述查找bar方法的过程中,一旦找到,则寻找过程立即中断,便不会再继续找了
29 a.bar()
经典类多继承
技术分享图片
 1 class D(object):
 2 
 3     def bar(self):
 4         print D.bar
 5 
 6 
 7 class C(D):
 8 
 9     def bar(self):
10         print C.bar
11 
12 
13 class B(D):
14 
15     def bar(self):
16         print B.bar
17 
18 
19 class A(B, C):
20 
21     def bar(self):
22         print A.bar
23 
24 a = A()
25 # 执行bar方法时
26 # 首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去C类中找,如果C类中么有,则继续去D类中找,如果还是未找到,则报错
27 # 所以,查找顺序:A --> B --> C --> D
28 # 在上述查找bar方法的过程中,一旦找到,则寻找过程立即中断,便不会再继续找了
29 a.bar()
新式类多继承

 

 三、多态 

 Pyhon不支持Java和C#这一类强类型语言中多态的写法,但是原生多态,其Python崇尚“鸭子类型”。

技术分享图片Python伪代码实现Java或者C#多态
技术分享图片Python“鸭子类型”

 

总结

以上就是本节对于面向对象初级知识的介绍,总结如下:

  • 面向对象是一种编程方式,此编程方式的实现是基于对  和 对象 的使用
  • 类 是一个模板,模板中包装了多个“函数”供使用
  • 对象,根据模板创建的实例(即:对象),实例用于调用被包装在类中的函数
  • 面向对象三大特性:封装、继承和多态

面向对象的应用场景:

1.多函数需使用共同的值,如:数据库的增、删、改、查操作都需要连接数据库字符串、主机名、用户名和密码

技术分享图片View Code

 

2.需要创建多个事物,每个事物属性个数相同,但是值的需求。如:张三、李四、杨五,他们都有姓名、年龄、血型,但其都是不相同。即:属性个数相同,但值不相同

技术分享图片View Code

问题:类和对象在内存中是如何保存?

答:类以及类中的方法在内存中只有一份,而根据类创建的每一个对象都在内存中需要存一份,大致如下图:

技术分享图片

如上图所示,根据类创建对象时,对象中除了封装 name 和 age 的值之外,还会保存一个类对象指针,该值指向当前对象的类。

当通过 obj1 执行 【方法一】 时,过程如下:

  1. 根据当前对象中的 类对象指针 找到类中的方法
  2. 将对象 obj1 当作参数传给 方法的第一个参数 self 

 

面向对象编程(代码片段)

创建类和对象 面向对象编程是一种编程方式,此编程方式的落地需要使用“类”和“对象”来实现,所以,面向对象编程其实就是对“类”和“对象”的使用。类:就是一个模板,模板里可以包含多个函数,函数里实现一些... 查看详情

javascriptjs-面向对象编程(代码片段)

查看详情

面向对象(代码片段)

一.函数式编程和面向对象的对比  面向过程:根据业务逻辑从上到下写垒代码  函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可  面向对象:对函数进行分类和封装,让开发“更快更好更强..... 查看详情

python面向对象编程(代码片段)

文章目录一、什么是面向对象编程二、类(class)和实例(instance)三、特性之一——数据封装四、访问限制五、特性之二、三——继承和多态-继承-多态六、获取对象信息-Type()-isinstance()-dir()七、实例属性和类属性此文参考廖雪峰官网... 查看详情

面向对象编程(代码片段)

面向对象编程面向过程编程:核心是过程,过程是一步一步的。先干啥,后干啥。对扩展性要求较低的程序例如:系统内核,git,计算器,等等。优点:逻辑清晰,复杂问题简单化,流程化缺点:扩展性差,可维护性差面向对象... 查看详情

python进阶—面向对象编程(代码片段)

目录文章目录目录面向对象思想面向对象编程面向对象编程的特性封装继承多态面向对象编程的优势Python的类属性与类方法Python类的实例化Python的对象属性与对象方法Python类的继承面向对象思想面向对象不仅是一种编程思想࿰... 查看详情

面向对象编程(代码片段)

一面向对象编程与面向过程编程1面向过程编程思想该思想核心是过程,指的是解决问题的步骤,即先干什么然后干什么,就像流水线一样,必须一步一步来,基于面向过程编程的是一种机械化的思维方式。优点:复杂问题流程... 查看详情

转载面向对象编程(代码片段)

...:https://blog.csdn.net/sunshine940326/article/details/72872386什么是面向对象编程面向对象的思想主要是以对象为主,将一个问题抽象出具体的对象,并且将抽象出来的对象和对象的属性和方法封装成一个类。面向对象是把构成问题事务分... 查看详情

面向对象简介(代码片段)

一、学习目标1.面向对象的技术语法2.面向对象的编程思想二、面向对象的概念OOP(Object-Programming,面向对象的编程)技术为编程人员敞开了一扇大门,使其编程的代码更简洁、更易于维护,并且具有更强的可重用性。三、OOP达到了... 查看详情

面向对象编程(上)(代码片段)

第四章面向对象编程(上)4.1面向对象(OOP)和面向过程(POP)4.2Java语言的基本元素:类和对象4.3对象的创建和使用4.1面向对象(OOP)和面向过程(POP)面向对象和面向过程二者都是一种思想,面向对象是相对于面向过程而... 查看详情

面向对象编程(代码片段)

面向对象基础面向对象编程介绍'''面向过程的编程思想核心过程二字,过程指的是解决问题的步骤,即先干什么\再干什么\后干什么基于该思想编写程序就好比在设计一条流水线,是一种机械式的思维方式优点:复杂的问题流... 查看详情

scala学习(函数式编程面向对象编程)(代码片段)

...础函数编程函数定义函数参数函数至简原则高阶函数编程面向对象编程基础面向对象编程高阶面向对象编程函数式编程基础函数编程函数定义packagelearn03objectdemo01defmain(args:Array[String]):Unit=//无参、无返回值deffun1():Unit=println(&... 查看详情

scala学习(函数式编程面向对象编程)(代码片段)

...础函数编程函数定义函数参数函数至简原则高阶函数编程面向对象编程基础面向对象编程高阶面向对象编程函数式编程基础函数编程函数定义packagelearn03objectdemo01defmain(args:Array[String]):Unit=//无参、无返回值deffun1():Unit=println(&... 查看详情

php面向对象(代码片段)

1.面向对象介绍     面向对象是一个编程思想。编程思想有面向过程和面向对象     面向过程:编程思路集中的是过程上     面向对象:编程思路集中在参与的对象2.面向对... 查看详情

面向对象,类(代码片段)

面向对象编程参考博客:www.cnblogs.com/Eva-J/p/7277026.html编程:  1面向流程编程:核心是过程,  2面向对象编程:解决了程序的扩展性,对某一个对象单独的修改,会立刻反应到整个体系中,如游戏中的一个人的参数的特征和... 查看详情

markdown学习-面向对象的编程(代码片段)

查看详情

面向对象编程-总复习(代码片段)

目录面向对象基础面向对象编程类与对象对象的属性的查找顺序给对象定制独有属性对象的绑定方法类与数据类型面向对象进阶类的继承类的派生类的组合菱形继承问题多态与多态性类的封装类的property特性类与对象的绑定方法... 查看详情

面向对象编程(代码片段)

...式即编程的方法论,标识一种编程风格.三大编程范式:1.面向过程编程:面向过程是一种以事件为中心的编程思想,编程的时候把解决问题的步骤分析出来,然后用函数把这些步骤实现,在一步一步的具体步骤中再按顺序调用函... 查看详情