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

猜你喜欢

转载自www.cnblogs.com/dreamer-lin/p/11619984.html