Python学习day23-面向对象的编程

Python学习day23-面向对象的编程

面向过程和面向对象

我们之前曾经了解过面向过程的一些方法,面向过程的核心也就是过程,过程就是解决问题的步骤,也就是我们将编程流程化,一步一步完成项目,设计一个流水线,面向过程的主要应用场景是一些一旦完成基本不会改变的场景,比如Linux内核,git等等,使用面向过程非常的方便,效率也很高。

面向过程的编程优点是可以将复杂的问题流程化,进而将其简单化,而其缺点也非常明显,我们都明白,工厂里的流水线的话,一旦中间某个环节出了问题,后面的环节都会出问题,且对其改造将会非常麻烦,官方来说就是程序的可扩展性会非常的差,所以我们引入面向对象的编程。

顾名思义,面向对象的编程的核心就在于对象二字,其思想非常的灵活,是以每一个对象为主体,每个对象都是属性和方法的集合体。夸张点说,每个对象都是我们创建的一个世界,我们所要做的就是在这个世界里增增减减,为其创造一切。面向对象所使用的的场景是经常需要变化的软件,一般这些变化都会集中在用户层,所以互联网应用,企业内部的软件以及各种游戏等,都是需要用到面向对象的思想的地方。

说了这么多,面向对象的编程所解决的就是程序的扩展性,对某一个对象单独修改的话,会直接反映到整个体系中,其扩展性非常好,非常的方便。当然其缺点也是很明显的,实现同一个功能,面向对象所使用的代码比面向过程要多出很多,而且面向对象的编程不能很准确的去预测程序的结果,因为其结果大多是不同对象之间相互作用的结果,所以结果不可控因素比较多,容易出现一些非代码性的bug。

类与对象

定义类和对象

类,也可以说是类型,实际上我们之前所用的type查看数据种类,也可以用在这里,看到的就是对象是哪个类里面实例化出来的。

而对象就是属性和方法,也可以说是函数的集合体,但不是必须的,并不是说对象里一定要有属性,有方法,这种思想会让面向对象的编程变得非常的复杂且冗余。

实例化

在现实世界中,我们是先存在一个个具体存在的对象,然后才会有分类的概念,但是Python中是相反的,Python中我们要先定义类,然后通过调用类来生成对象,这个过程就叫做实例化。

定义类的方法,就是通过关键字class+函数名():

现在我们就来尝试定义一个类

 
 
 
x
 
 
 
 
1
# 首先定义类名,建议驼峰体命名,约定俗成的事情,没有什么特别的
2
# class 关键字,类名
3
class Student:  
4
 # 变量来表示属性
5
 school = 'oldboy'
6
    print('我在定义一个类')
7
 def choose(self):
8
 print('选课...')
9
10
 def study(self):
11
 print('学习...')
12
# 这里我们就生成了一个类,名为Student,需要注意的几点是:
13
# 1. 类中可以有任意的python代码,这些在函数定义以外的代码在类定义的时候就会执行,并不是调用的时候才执行,函数内部的代码则是调用的时候才会执行。
14
# 2. 定义类的时候会产生新的名称空间,用来存放类的变量名与函数名,可以通过.__dict__来查看
15
16
# 程序当中类的一些用法:
17
print(Student.school)# 即取出school的值
18
Student.school = 'xxx'# 为类中的变量赋值
 
 

这里有一些类的特殊属性,这些都是Python为类内置的特殊属性,可以作为了解和扩展。

 
 
 
x
 
 
 
 
1
.__name__# 类的名字,字符串形式
2
.__doc__# 类的文档字符串
3
.__base__# 类的第一个父类
4
.__basses__# 类的所有父类构成的元组
5
.__dict__# 类的字典属性
6
.__module__# 类定义所在的模块 
7
.__class__ # 实例对应的类
 
 

对象

 
 
 
xxxxxxxxxx
41
 
 
 
 
1
# 生成对象(类加括号,生成对象)
2
stu1 = Student()
3
# 获取属性和方法,直接通过.来获取
4
print(stu1.school)
5
# 对象调用方法,第一个self参数不用传参
6
print(stu1.choose)
7
stu2 = Student()
8
print(stu2.school)
9
# 查看类中的属性和方法
10
print(Student.__dict__['school'])
11
Student.__dict__['choose'](123)# 通过类名直接调用其内部函数的话需要传参给全部的参数,而不是像对象调用方法一样,第一个self形参不必传参,因为对象调用方法的时候会把自己作为第一个self的实参传进去。
12
Student.choose(111)
13
14
# 向对象中放属性
15
# 上面是第一种方式
16
# 第二种,通过__init__在类里面定义对象的属性,其优点是可以在类定义阶段定制属性,为实例化对象提供多样性
17
class Student:  # ()
18
 # 变量来表示属性
19
 school = 'oldboy'
20
21
 # 注意定义名字不要写错,ini之后再tab,不能in直接tab
22
 def __init__(self, name):
23
 self.name = name
24
25
 def choose(self):
26
 print('选课...')
27
28
 def study(self):
29
 print('学习...')
30
31
# 产生对象
32
stu1 = Student('nick')
33
# 当实例化产生对象时会自动调用__init__方法,来完成对象的初始化
34
print(stu1.name)
35
stu2 = Student('jason')
36
print(stu2.name)
37
stu1 = Student('nick')
38
Student.__init__(stu1,'nick')
39
print(stu1.name)
40
41
# 从以上例子我们可以看出,在调用类的时候发生了两件事:
42
# 1. 首先创建一个空对象
43
# 2. 自动触发类中__init__功能的执行,将stu1以及后面括号内的参数一并传入
 
 

产生对象

属性查找顺序

 
 
 
xxxxxxxxxx
13
 
 
 
 
1
# 对象自己的属性和方法
2
stu1 = Student()
3
stu1.name = 'ltd'
4
stu1.school = 'xxx'
5
print(stu1.__dict__)
6
print(stu1.school)
7
8
# 属性查找顺序:
9
# 1. 先从对象自身找-->所属类中找-->报错
10
11
Student.school = 'xxxx'
12
stu2 = Student()
13
print(stu2.school)
 
 

一切皆对象

一句话,Python中一切皆对象。

猜你喜欢

转载自www.cnblogs.com/Xu-PR/p/11412865.html
今日推荐