Python之旅(七)面向对象

三大编程范式

三大编程范式(这三者各有千秋,不分好坏):

  面向过程编程

  函数式编程

  面向对象编程

面向过程编程

“面向过程”(Procedure Oriented)是一种以过程为中心的编程思想。

过程是指解决问题的步骤。例如问题:如何把大象放入一个冰箱?步骤:先打开冰箱,在将大象放入冰箱,最后关上冰箱。面向过程是一种较机械式的思维方式。

优点:

  复杂的问题流程化,进而简单化(一个复杂的问题,分成一个个小的步骤去实现,实现小的步骤将会非常简单)。

  性能比面向对象高,因为类调用时需要实例化,比较消耗资源

缺点:

  没有面向对象易维护、易复用、易扩展

应用场景:

  一旦完成基本很少改变的场景,著名的例子有Linux內核,git,以及Apache HTTP Server、嵌入式开发等

函数式编程

特点:不可变数据、第一类对象、尾调用

更多见:Python之旅(三)函数

面向对象编程

面向对象(Object Oriented,OO)是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。

对象是属性和方法结合体,与面向过程机械式的思维方式形成鲜明对比,面向对象更加注重对现实世界的模拟。

优点:

  易维护、易复用、易扩展

缺点:

  1. 复杂度远高于面向过程,新手极容易出现过度设计的问题。一些扩展性要求低的场景使用面向对象会徒增编程难度,比如管理linux系统的shell脚本就不适合用面向对象去设计,面向过程反而更加适合。

  2. 无法向面向过程的程序设计流水线式的可以很精准的预测问题的处理流程与结果,面向对象的程序一旦开始就由对象之间的交互解决问题,即便是上帝也无法准确地预测最终结果。于是我们经常看到对

  战类游戏,新增一个游戏人物,在对战的过程中极容易出现的bug技能,一刀砍死3个人,这种情况是无法准确预知的,只有对象之间交互才能准确地知道最终的结果。

应用场景:

  需求经常变化的软件,一般需求的变化都集中在用户层,互联网应用,企业内部软件,游戏等都是面向对象的程序设计大显身手的好地方

  面向对象的程序设计并不是全部。对于一个软件质量来说,面向对象的程序设计只是用来解决扩展性。

对编程的理解

最开始就是无组织无结构的,在简单控制流中按步写指令

从上述的指令中提取重复代码块或逻辑,组织到一起(比如函数),可以提高代码重用性,此时代码开始结构化,更具有逻辑性

但是只有函数的话,数据和方法(方法即函数-->操作数据的过程)不方便结合

当把数据和行为内嵌到一个东西(函数或类)里面,此时数据和行为就可以很好的结合,由此产生了“对象”的概念。对象就是数据和行为的结合体

类和对象

对象和类的理解

1在现实世界中:先有对象,再有类。

  世界上肯定是先出现各种各样的客观存在的物体,然后随着人类文明的发展,人类站在不同的角度总结出了不同的种类,如人类、动物类、植物类等概念.

  也就说,对象是具体的存在,而类仅仅只是一个抽象化的概念,并不真实存在

2在程序中:务必保证先定义类,后产生对象

  这与函数的使用是类似的,先定义函数,后调用函数,类也是一样的,在程序中需要先定义类,后调用类

  不一样的是,调用函数会执行函数体代码返回的是函数体执行的结果,而调用类会产生对象,返回的是对象

类:将一种事物的共同点(共同属性、共同行为)提取并整合到一起就形成了类

对象:类的具体化产物,即通过类产生一个对象,这个过程就是实例化,对象也称为实例

面向对象设计与面向对象编程

面向对象设计(Object oriented design)将一类事物的数据和行为整合到一起

面向对象编程(object-oriented programming)用定义类 + 对象/实例 的方式实现面向对象的设计

 1 # 面向对象设计
 2 def dog(name, color, type):
 3     def init(name, color):
 4         dic = {
 5             ‘color‘:color,
 6             ‘name‘:name,
 7             ‘type‘:type,
 8             ‘run‘:run,
 9             ‘bark‘:bark,
10         }
11         return dic
12
13     def bark(dog):
14         print(‘{} can bark‘.format(name))
15
16     def run(dog):
17         print(‘{} can run‘.format(name))
18
19     return init(name, color)
20
21 dog01 = dog(‘xiaohuang‘, ‘yellow‘, ‘藏獒‘)
22 print(dog01)
23
24 print(dog01[‘name‘], dog01[‘color‘])
25 dog01[‘run‘](dog01)
26
27 # 执行结果
28 # {‘color‘: ‘yellow‘, ‘name‘: ‘xiaohuang‘, ‘type‘: ‘藏獒‘, ‘run‘: <function dog.<locals>.run at 0x00BA38A0>, ‘bark‘: <function dog.<locals>.bark at 0x00BA3858>}
29 # xiaohuang yellow
30 # xiaohuang can run

  

# 面向对象编程
class dog():
    """定义一个有狗有关的类,能跑能吠"""
    subject = ‘动物界 / 脊索动物门 / 哺乳纲 / 食肉目 / 犬科‘ # 类的数据属性-->类变量

    def bark(): #类的函数属性-->方法
        print(‘can bark‘ )

    def run(self):
        print(‘can run‘)

print(dog.__dict__) #查看所有属性名和属性值组成的字典

print(dog.subject) #访问类变量,本质就是通过__dict__来实现这个过程
print(dog.__dict__[‘subject‘])

dog.bark() #调用类的函数属性-->方法,本质也是通过__dict__来实现
dog.__dict__[‘bark‘]()

print(dog.__module__) #__main__
print(dog.__name__) #dog
print(dog.__doc__) #定义一个有狗有关的类,能跑能吠

# #python为类内置的特殊属性
# 类名.__name__# 类的名字(字符串)
# 类名.__doc__# 类的文档字符串
# 类名.__base__# 类的第一个父类
# 类名.__bases__# 类所有父类构成的元组
# 类名.__dict__# 类的字典属性
# 类名.__module__# 类定义所在的模块
# 类名.__class__# 实例对应的类(仅新式类中)

实例化

 1 class dog():
 2     """定义一个有狗有关的类,能跑能吠"""
 3     subject = ‘动物界 / 脊索动物门 / 哺乳纲 / 食肉目 / 犬科‘
 4
 5     def __init__(self, name, color, type): #用于对象的初始化
 6         self.name = name #实例属性
 7         self.color = color
 8         self.type = type
 9
10     def bark(self):
11         print(‘%s can bark‘ %(self.name))
12
13     def run(self):
14         print(‘ can run‘)
15
16 #类名加上括号就是在实例化,创建了一个对象(可以理解为函数的运行,返回值就是一个实例)
17 #实例化会自动调用__init__函数,创建对象需要的参数会自动传给__init__函数
18 dog1 = dog(‘小黄‘, ‘yello‘, ‘藏獒‘)
19
20 print(dog1.__dict__) #这里查看了dog1这个对象的属性字典
21
22 print(dog1.subject) #对象可以访问到类变量。在dog1对象的属性字典中找不到会去类变量中找
23
24 dog.bark(dog1) #通过类调用类方法
25 dog1.bark() #通过实例调用类方法,实例中是没有这个方法的,会到类中找到该方法,这样可以减少内存的占用
26 # dog1.bark(dog1) #此处会报错,因为实例调用类方法时class会自动将d实例dog1传给self参数

类变量和实例变量

类变量:

 1 class dog():
 2     """定义一个有狗有关的类,能跑能吠"""
 3     subject = ‘动物界 / 脊索动物门 / 哺乳纲 / 食肉目 / 犬科‘
 4
 5     def __init__(self, name, color, type): #用于对象的初始化
 6         self.name = name #实例属性
 7         self.color = color
 8         self.type = type
 9
10     def bark(self):
11         print(‘%s can bark‘ %(self.name))
12
13     def run(self):
14         print(‘ can run‘)
15
16
17 # 类属性的相关操作
18 print(dog.subject) #查看类属性
19
20 dog.subject = ‘犬科‘ #修改类属性
21 print(dog.subject)
22 dog1 = dog(‘小黄‘, ‘yellow‘, ‘藏獒‘)
23 print(dog1.__dict__)
24 print(dog1.subject) #实例变量可以访问到类属性
25
26 dog.friend = ‘human‘ #增加类属性
27 print(dog.friend)
28 def eat_meat(self):
29     print(‘eat meat‘)
30 dog.eat = eat_meat
31 dog1.eat()
32 print(dog.__dict__) #查看类的属性字典
33
34 del dog.friend #删除类属性
35 del dog.eat
36 print(dog.__dict__)

类变量的增删改查

实例变量:

 1 class dog():
 2     """定义一个有狗有关的类,能跑能吠"""
 3     subject = ‘动物界 / 脊索动物门 / 哺乳纲 / 食肉目 / 犬科‘
 4
 5     def __init__(self, name, color, type): #用于对象的初始化
 6         self.name = name #实例属性
 7         self.color = color
 8         self.type = type
 9
10     def bark(self):
11         print(‘%s can bark‘ %(self.name))
12
13     def run(self):
14         print(‘ can run‘)
15
16
17 dog1 = dog(‘小黄‘, ‘yello‘, ‘藏獒‘) #创建实例
18 print(dog1.__dict__)
19
20 # 查看实例属性
21 print(dog1.name)
22 print(dog1.run)
23 dog1.run()
24
25 # 增加实例属性
26 dog1.age = 4.5
27 print(dog1.age)
28
29 # 不要修改底层的字典属性
30 # dog1.__dict__[‘name‘] = ‘大黄‘
31 # print(dog1.__dict__)
32
33 # 修改实例属性
34 dog1.age = 5
35 print(dog1.age)
36
37 # 删除实例属性
38 del dog1.age

实例变量的增删改查

类变量与实例变量注意点:

  使用类名或实例名加 . 点时,对变量只搜找到类,类里没有找到就报错

 1 class dog():
 2     """定义一个有狗有关的类,能跑能吠"""
 3     subject = ‘食肉目 / 犬科‘
 4     x = [‘a‘, ‘b‘]
 5
 6     def __init__(self, name):
 7         self.name = name #实例属性
 8     def bark(self):
 9         print(‘%s can bark‘ %(self.name))
10
11
12 dog1 = dog("小黄")
13 print(dog1.subject) #食肉目 / 犬科
14
15 #会在实例的属性中添加新变量,不会影响同名的类属性
16 dog1.subject = ‘狗科‘
17 print(dog1.subject) #狗科
18
19 print(dog.subject) #食肉目 / 犬科
20
21 dog2 = dog(‘小蓝‘)
22 print(dog2.subject) #食肉目 / 犬科
23
24 # 追加类变量的值
25 dog1.x.append(1)
26 print(dog1.x) #[‘a‘, ‘b‘, 1]
27 print(dog.x) #[‘a‘, ‘b‘, 1]
28 print(dog2.x) #[‘a‘, ‘b‘, 1]

01

 1 area = ‘asia‘
 2 class dog():
 3     """定义一个有狗有关的类,能跑能吠"""
 4     subject = ‘食肉目 / 犬科‘
 5
 6     def __init__(self, name):
 7         self.name = name #实例属性
 8         print(‘area‘, area)
 9     def bark(self):
10         print(‘%s can bark‘ %(self.name))
11
12 # 使用类名或实例名加 . 点时对变量只搜找到类,类里没有找到就报错
13 dog1 = dog(‘小黄‘)
14 print(dog1.area) #AttributeError: ‘dog‘ object has no attribute ‘area‘

02

 1 area = ‘asia‘
 2 class dog():
 3     """定义一个有狗有关的类,能跑能吠"""
 4     subject = ‘食肉目 / 犬科‘
 5     area = ‘europen‘
 6     def __init__(self, name):
 7         self.name = name
 8         print(‘area:‘, area) #没加 点号,访问不到类中的area
 9     def bark(self):
10         print(‘%s can bark‘ %(self.name))
11
12 dog1 = dog(‘小黄‘)
13 # 运行结果
14 # area:asia

03

参考

https://www.cnblogs.com/linhaifeng/articles/6182264.html

原文地址:https://www.cnblogs.com/dreamer-lin/p/11619984.html

时间: 2024-08-15 09:27:28

Python之旅(七)面向对象的相关文章

python学习笔记(七):面向对象编程、类

一.面向对象编程 面向对象--Object Oriented Programming,简称oop,是一种程序设计思想.在说面向对象之前,先说一下什么是编程范式,编程范式你按照什么方式来去编程,去实现一个功能.举个例子,你要做饭,可以用电磁炉,也可以用煤气灶.不同的编程范式本质上代表对各种类型的任务采取的不同的解决问题的思路,两种最重要的编程范式分别是面向过程编程和面向对象编程. 提到面向对象,就不得不提到另一种编程思想,面向过程:什么是面向过程呢,面向过程的思想是把一个项目.一件事情按照一定的顺

python学习笔记(七) - 面向对象高级编程

一. 为类动态添加属性和方法: 1. 动态给一个实例添加属性和方法: 给一个实例绑定的方法,对另一个实例是不起作用的. class Student(object): pass s = Student() s.name = 'Michael' # 动态给实例绑定一个属性 print s.name def set_age(self, age): # 定义一个函数作为实例方法 self.age = age from types import MethodType s.set_age = MethodT

python之旅:面向对象之继承与派生

一 初识继承 编写类时,并非总要从空白开始.如果你要编写的类正好是另一个现成类的特殊版本,可使用继承来减少代码冗余,子类会“遗传”父类的属性,从而解决代码重用问题 什么是继承 继承是一种创建新类的方式,新建的类可以继承一个或多个父类(python支持多继承),父类又可称为基类或超类,新建的类称为派生类或子类. 一个类继承另一个类时,他将自动获得另一个类的所有属性和方法:原有的类称为父类,而新类称为子类.子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法. python中类的继承分为

Python爬虫实战七之计算大学本学期绩点

大家好,本次为大家带来的项目是计算大学本学期绩点.首先说明的是,博主来自山东大学,有属于个人的学生成绩管理系统,需要学号密码才可以登录,不过可能广大读者没有这个学号密码,不能实际进行操作,所以最主要的还是获取它的原理.最主要的是了解cookie的相关操作. 本篇目标 1.模拟登录学生成绩管理系统 2.抓取本学期成绩界面 3.计算打印本学期成绩 1.URL的获取 恩,博主来自山东大学~ 先贴一个URL,让大家知道我们学校学生信息系统的网站构架,主页是 http://jwxt.sdu.edu.cn:

Python学习--第七周

本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个支持多用户在线的FTP程序 面向对象高级语法部分 经典类vs新式类 把下面代码用python2 和python3都执行一下 1 #_*_coding:utf-8_*_ 2 3 4 class A: 5 def __init__(self): 6 self.n = 'A' 7 8 class B(A): 9 # def __init__(self): 1

Python爬虫入门七之正则表达式

在前面我们已经搞定了怎样获取页面的内容,不过还差一步,这么多杂乱的代码夹杂文字我们怎样把它提取出来整理呢?下面就开始介绍一个十分强大的工具,正则表达式! 1.了解正则表达式 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个"规则字符串",这个"规则字符串"用来表达对字符串的一种过滤逻辑. 正则表达式是用来匹配字符串非常强大的工具,在其他编程语言中同样有正则表达式的概念,Python同样不例外,利用了正则表达式,我

转 Python爬虫入门七之正则表达式

静觅 » Python爬虫入门七之正则表达式 1.了解正则表达式 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑. 正则表达式是用来匹配字符串非常强大的工具,在其他编程语言中同样有正则表达式的概念,Python同样不例外,利用了正则表达式,我们想要从返回的页面内容提取出我们想要的内容就易如反掌了. 正则表达式的大致匹配过程是:1.依次拿出表达式和文本中的字符比较,2.如果每一个

python学习笔记七:条件&循环语句

1.print/import更多信息 print打印多个表达式,使用逗号隔开 >>> print 'Age:',42 Age: 42   #注意个结果之间有一个空格符 import:从模块导入函数 import 模块 from 模块 import 函数 from 模块 import * 如果两个模块都有open函数的时候, 1)使用下面方法使用: module1.open()... module2.open()... 2)语句末尾增加as子句 >>> import ma

开始 Python 之旅

开始 Python 之旅 课程来源 本课程基于 Python for you and me 教程翻译制作,其中参考了 Python tutorial 和 The Python Standard Library,并对原教程的内容进行了改进与补充. 相关链接地址如下: Python tutorial:http://www.pythondoc.com/pythontutorial3/index.html Python for you and me:http://pymbook.readthedocs.