初识面向对象

nerocl nerocl     2022-10-11     221

关键词:

一、面向对象 & 面向过程

1、面向过程(流水线式思维):

  • 优点:程序复杂度较低,依据执行步骤顺序编写代码即可
  • 缺点:代码复用性差,前后逻辑耦合度要高
  • 应用场景:一旦完成基本很少改变的场景,著名的例子有Linux內核,git,以及Apache HTTP Server等

2、面向对象(上帝式思维):

  • 优点:可扩展性高,对程序某处的更改会反映到全局
  • 缺点:可控性差,不如面向对象式编程可以准确预测程序执行结果
  • 应用场景:需求经常变化的软件,一般需求的变化都集中在用户层,互联网应用,企业内部软件,游戏等

二、类和对象

定义:在python中,用变量表示属性,用函数表示方法,因而具有相同属性和方法的一类事物就是‘类’,对象则是这一类事物的具体体现

1、类

①声明类

class 类名:
    类的文档字符串
    类体

②类的作用:

  • 属性引用:类名.属性名
  • 方法调用:类名.方法名(对象名) / 对象名.方法名()
  • 实例化:类名加括号就是实例化,会自动触发init函数的运行,可以用它来为每个实例定制自己的特征。
  • 实例化的过程本质:类——>对象的过程
  • self:在实例化过程中自动将对象(实例)自身传递给init方法的第一个参数,约定俗成将这个参数写作self
  • 特殊的类属性:
1 类名.__dict__:查出的是一个字典,key为属性名,value为属性值
2 类名.__name__# 类的名字(字符串)
3 类名.__doc__# 类的文档字符串
4 类名.__base__# 类的第一个父类(在讲继承时会讲)
5 类名.__bases__# 类所有父类构成的元组(在讲继承时会讲)
6 类名.__dict__# 类的字典属性
7 类名.__module__# 类定义所在的模块
8 类名.__class__# 实例对应的类(仅新式类中)

2、对象

①定义:对象是类的具体体现,即实例

②作用:属性调用、方法调用(方法也称作动态属性,所以也可以归为一类)

3、对象之间的交互

 1 class Dog():
 2     def __init__(self,name,blood,aggr,sex):
 3         self.name = name
 4         self.blood = blood
 5         self.aggr = aggr
 6         self.sex = sex
 7 
 8     def bite(self,person):
 9         person.blood -= self.aggr
10         print(33[1;31m{} 33[0m被 33[1;31m{} 33[0m咬了,掉了33[1;31m{} 33[0m的血.format(person.name,self.name, self.aggr))
11 
12 class Person():
13     def __init__(self,name,blood,aggr,sex):
14         self.name = name
15         self.blood = blood
16         self.aggr = aggr
17         self.sex = sex
18 
19     def attack(self,dog):
20         dog.blood -= self.aggr
21         print(33[1;31m{} 33[0m被 33[1;31m{} 33[0m打了,掉了33[1;31m{} 33[0m的血.format(dog.name,self.name, self.aggr))
22 
23 d = Dog(小狗儿,100,10,teddy)
24 p = Person(小孩儿,100,5,boy)
25 
26 d.bite(p)
27 print({}的血量.format(p.name),p.blood)
28 
29 p.attack(d)
30 print({}的血量.format(d.name),d.blood)

三、类的命名空间

1、定义:创建一个类就会创建一个类的命名空间,用来存储类中定义的所有名字,这些名字被称为类的属性

2、类的属性:

静态属性:在类中定义的变量,共享给所有对象
动态属性:在类中定义的方法,绑定到所有对象

3、举例

 1 # 静态属性
 2 class Foo:
 3     static_attr = Foo_attr
 4     def func(self):
 5         print(Foo_method)
 6 
 7 f1 = Foo()
 8 print(id(f1.static_attr))
 9 >>> 18769712
10 print(id(Foo.static_attr))
11 >>> 18769712
12 
13 # 动态属性
14 class Foo:
15     static_attr = Foo_attr
16     def func(self):
17         print(Foo_method)
18 
19 f1 = Foo()
20 print(f1.func)
21 >>> <bound method Foo.func of <__main__.Foo object at 0x00000000006BBCF8>>
22 print(Foo.func)
23 >>> <function Foo.func at 0x00000000006BE840>

四、对象命名空间

1、定义:

创建一个对象/实例就会创建一个对象/实例的名称空间,存放对象/实例的名字,称为对象/实例的属性

2、对象使用属性的顺序:

自己的命名空间—>类的命名空间—>父类的命名空间—>都找不到则报错

五、类的组合

1、定义:在一个类中以另外一个类的对象作为属性,称为类的组合

2、适用场景:

  • 当类之间有显著不同,并且较小的类是较大的类所需要的组件时,用组合比较好
  • 当类与类之间的关系为’什么是什么’的时候可以考虑使用类的组合

3、举例

 1 from math import pi
 2 class Circle:
 3     def __init__(self,radius):
 4         self.radius = radius
 5     def area(self):
 6         return self.radius**2*pi
 7     def perimeter(self):
 8         return self.radius*2*pi
 9 
10 class Ring:
11     def __init__(self,R,r):
12         self.outer_circle = Circle(R) # 此处即为类的组合
13         self.inner_circle = Circle(r) # 此处即为类的组合
14     def area(self):
15         return self.outer_circle.area() - self.inner_circle.area()
16     def perimeter(self):
17         return self.outer_circle.perimeter()+self.inner_circle.perimeter()
18 
19 r = Ring(10,5)
20 print(r.area())
21 print(r.perimeter())

六、面向对象三大特点——继承

1、定义:

继承是一种创建新类的方式,在python中新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类

2、继承的使用场景:什么是什么

3、查看父类的双下方法:Foo.__bases__

4、种类:

①单继承

  • 父类中没有的属性在子类中出现叫做派生属性
  • 父类中没有的方法在子类中出现叫做派生方法
  • 只要是子类的对象调用,子类中有的名字一定用子类的,子类中没有才找父类的,如果父类也没有报错
  • 如果父类、子类都有则用子类的 
    • 如果还想用父类的,单独调用父类的: 
      1、父类名.方法名 需要自己传self参数 
      2、super().方法名 不需要自己传self
  • 正常的代码中单继承 ===> 减少了代码的重复
  • 继承表达的是一种子类是父类的关系

②多继承

  • 在python2中 
    • 新式类:继承object类的才是新式类——>遵循广度优先原则 
      可以用Foo.\_\_mro\_\_方法查看继承顺序,mro方法只在新式类中存在
    • 经典类:直接创建一个类默认是经典类——>遵循深度优先原则
  • 在python3中 
    • 所有在python3中创建的类都是新式类——>遵循广度优先原则
    • 可以用Foo.__mro__方法查看继承顺序,mro方法只在新式类中存在

5、super()关键字

①super()只在python3中存在

②super的本质 :不是单纯找父类而是根据调用者的节点位置的广度优先顺序来的

第一小节初识面向对象(代码片段)

阅读目录楔子面向过程vs面向对象初识面向对象  类的相关知识  对象的相关知识  对象之间的交互  类命名空间与对象、实例的命名空间  类的组合用法  初识面向对象小结面向对象的三大特性  继承  多态... 查看详情

面向对象---初识对象

<!doctypehtml><htmllang="en"><head> <metacharset="UTF-8"> <title>面向对象---初识对象</title> <scripttype="text/javascript"> /* *表达一个人的完整信息 */ /*第一种,三个变量之间没有必然的联系----- 查看详情

初识javascriptoop(js面向对象)

初识JavaScriptOOP(js面向对象)Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象。但是,它又不是一种真正的面向对象编程(OOP)语言,因为它的语法中没有class(类)。一、生成实例对象的原始模式... 查看详情

初识面向对象

一、面向对象&面向过程1、面向过程(流水线式思维):优点:程序复杂度较低,依据执行步骤顺序编写代码即可缺点:代码复用性差,前后逻辑耦合度要高应用场景:一旦完成基本很少改变的场景,著名的例子有Linux內核,git... 查看详情

面向对象思想初识

面向对象思想概述Java语言是一种面向对象的程序设计语言,而面向对象思想是一种程序设计思想,我们在面向对象思想的指引下,使用Java语言去设计、开发计算机程序。这里的对象泛指现实中一切事物,每种事物都具备自己的... 查看详情

面向对象——初识对象

一、类的相关知识1)初识类声明deffunctionName(args):‘函数文档字符串‘函数体‘‘‘class类名:‘类的文档字符串‘类体‘‘‘#我们创建一个类classData:pass声明类classPerson:#定义一个人类role=‘person‘#人的角色属性都是人defwalk(self):#... 查看详情

java基础——初识面向对象

 面向对象面向过程&面向对象面向过程思想步骤请简单:第一步做什么,第一步做什么面向过程适合处理一些较为简单的东西面向对象思想物以类聚,分类的思维模式,思考的问题首先会解决问题需要哪些分裂,然后对这... 查看详情

面向对象初识

面向过程编程--函数--实现人狗大战defperson(*args):defattack(dog):print(‘%s打了%s‘%(dic[‘name‘],dog[‘name‘]))dic={‘name‘:args[0],‘sex‘:args[1],‘aggr‘:args[2],‘blood‘:args[3],‘attack‘:attack}#attack方法----放在字典里面returndic 查看详情

面向对象思想初识概述

概述Java语言是一种面向对象的程序设计语言,而面向对象思想是一种程序设计思想,我们在面向对象思想的指引下,使用Java语言去设计、开发计算机程序。这里的对象泛指现实中一切事物,每种事物都具备自己的属性和行为。... 查看详情

javascript对象及初识面向对象

在JavaScript中,对象是拥有属性和方法的数据,属性是与对象相关的值,方法是能够在对象上执行的动作。JavaScript是通过一种叫做原型的方式来实现面向对象编程的。(面向对象仅仅是一个概念或者编程思想,它不依赖于某个语... 查看详情

java学习·初识面向对象基础一

面向对象基础1.1面向过程与面向对象的区别面向过程和面向对象二者都是思考问题的方式,再简单的事物时,可以线性思考时使用面向过程,但当事物较为复杂时,只能使用面向对象设计。但二者并不是对立的,在解决复杂问题... 查看详情

初识面向对象(代码片段)

        面向对象VS函数式编程VS面向对象      面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考... 查看详情

初识面向对象

属性引用:类名和属性classPerson:  定义一个人类  role=‘person‘     人的角色属性  defwalk(self):    走路的一个方法    print(‘personiswalking‘)print(Person.role) 查看人的role属性print(Person.walk) ... 查看详情

初识面向对象

面向对象编程是一种思想对象就是具体的拥有准确属性值的一些变量类:一类具有相同属性和方法的事物 类的定义 class关键字类名的首字母大写类中直接定义属性:静态属性(变量) 和动态属性(函数)类名的两个作用:属性... 查看详情

day7初识面向对象,面向对象之继承与派生

一、面向对象引言 一、面向对象的程序设计的由来  详述见:http://www.cnblogs.com/linhaifeng/articles/6428835.html  二、面向对象引子  写一个简单程序:人狗大战角色:人、狗人角色特性:攻击力、生命值、名字、等级... 查看详情

初识面向对象

构造函数:主要用来在创建对象时初始化对象,即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。构造函数主要用来在创建对象时完成对对象属性的一些初始化等操作,当创建对象时,对象会自动调用它的... 查看详情

17-面向对象初识

目录: 面向对象:以数据为重心,所有的处理代码都是围绕数据展开,数据即对象;就是一件事‘让谁来做’,这个‘谁’就是对象,他要怎么做是他自己的事,反正最后一群对象合力能把这件事做好就行了;比如,自己组... 查看详情

python中面向对象初识到进阶(代码片段)

面向对象初识到进阶#面向对象结构:#class类名:#def__init__(self,参数1,参数2):#self.对象的属性1=参数1#self.对象的属性2=参数2##def方法名(self):pass##def方法名2(self):pass##对象名=类名(1,2)#对象就是实例,代表一个具体的东西##类名():类名+... 查看详情