0x1 面向对象 Vs 面向过程今天开启一个新坑,讲一讲
面向对象的编程
的事,什么,你没有对象?没关系,你还有Python
。
很多书都讲过这些概念,我也不是很想重复,具体定义请看百度百科,面向对象编程和面向过程编程,我说说我的理解吧,面向对象不是有没有class的区别,而是是否有整体性的区别,所以即是你用c语言
,任然可以写出面向对象的感觉,但用Java
也不一定有面向对象的味道。举个例子,完成一个老师给学生上课的功能。
def teach(teacherName,course):
print(f"我是{teacherName}老师,我在教{course}")
class Teacher:
def __init__(self,teacherName,course):
self.name = teacherName
self.course = course
def teach(self):
print(f"我是{self.name}老师,我在教{self.course}")
name = "mouse"
course = "python"
teach(name,course)
mouse = Teacher(name,course)
mouse.teach()
这里分别用类和函数实现了这个功能,看起来没什么区别是吧,而且用类的代码还多这么多,下面就让我们慢慢来体会面向对象的好处,为老师增加一个吃饭的功能
def teach(teacherName,course):
print(f"我是{teacherName}老师,我在教{course}")
def eat(teacherName):
print(f"我是{teacherName}老师,我在吃饭")
class Teacher:
def __init__(self,teacherName,course):
self.name = teacherName
self.course = course
def teach(self):
print(f"我是{self.name}老师,我在教{self.course}")
def eat(self):
print(f"我是{self.name}老师,我在吃饭")
name = "mouse"
course = "python"
teach(name,course)
eat(name)
mouse = Teacher(name,course)
mouse.teach()
mouse.eat()
现在可能有一点感觉了吧,如果后面我们在增加很多功能,比如唱歌,跳舞,如果使用面向过程的思想,就会显得很杂乱,所以在面向过程的时候通常会以模块来封装,而面向对象最小的单位就是类。
这就是整体性,其实也就是封装
,面向对象是以对象的特点来进行构建编码的,而面向过程是以功能(函数)来进行构建编码的。而面向对象还支持抽象,继承等更强大的方式。这个后面讲了,所以总结,面向对象就是以构建对象(类似修房子)的逻辑进行编程的
0x3 验证猜想类:是一个模板,比如老师,这是一类人物,通常我们把教书育人的人称为老师
实例: 具体的某一个老师,比如Mouse老师,很明显意味着老师的名字叫Mouse,当然也可以有Cat老师
属性:属性就是一个角色的属性(实在找不到更合适的词了),比如老师的名字,年龄。他告诉了我们类的特点
方法:就是类的功能,这个类可以做什么,比如老师可以教学
实例化:便是把类变成实例的过程,在这期间,我们把类(模板)中的属性赋予特定的值,让这个类变为具体的一个实例,python中的语法是类加括号比如这里的teacher()
构造方法:实例化时默认调用的方法,也称为初始化方法,Python的构造方法是__init__()
self:就是当前正在构造的类的实例
先定义一个类
class Teacher:
def __init__(self,teacherName,course): #py
self.name = teacherName #老师类的名称属性
self.course = course #老师类的教学的课程属性
def teach(self): #教学方法
print(f"我是{self.name}老师,我在教{self.course}")
实例化两个实例
name = "mouse"
course = "python"
mouse = Teacher(name,course) #实例化,实例一个叫mouse并且教python的老师实例
cat = Teacher("cat","Java") #实例化,实例一个叫cat并且教Java的老师实例
先让我们看看这个两个实例的类型
print(type(mouse))
print(type(cat))
可以看到两个都是Teacher类,再分别调用他们的teach方法试试
可以看到他们的确是自己特有的方法,下面让我们来验证一下构造方法被调用的时机,先定义一个类
class A:
def __init__(self):
print("构造方法被调用了")
a = A()
果然是自动在实例化的时候被调用,下面就让我们来看看本节课的主角,Self
首先让我们看看self是什么,我们打印一下self看看
class A:
def __init__(self):
print(self)
print(type(self))
print("构造方法被调用了")
a = A()
这里self
是一个object也就是实例对象,而他的类型是A类,刚好验证了我们猜想,让我们来进行一个有趣的玩法,看下面的这段代码
class A:
def __init__(self,name):
self.name = name
def who_am_i(self):
print(self)
print("我是"+self.name)
a = A("mouse")
b = A("cat")
A.__init__(a,"cat")
A.__init__(b,"mouse")
a.who_am_i()
b.who_am_i()
A.who_am_i(a)
A.who_am_i(b)
输出下面的结果
因为self参数是实例,所以我们只要手动给他传实例对象,就行了,而平时我们调用方法时,python会默认把当前的实例对象给self参数,所以我们可以用self来获取当前的实例的属性self.name
和方法self.teach
,当然既然是参数那我们甚至可以改名字比如叫this
class A:
def __init__(this,name):
print(f"this:{this}")
this.name = name
def who_am_i(self):
print(self)
print("我是"+self.name)
a = A("mouse")
a.who_am_i()
好了,本次的python教程就到这里啦,下次再见
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)