Python面向对象

Python面向对象,第1张

今天开启一个新坑,讲一讲面向对象的编程的事,什么,你没有对象?没关系,你还有Python

0x1 面向对象 Vs 面向过程

很多书都讲过这些概念,我也不是很想重复,具体定义请看百度百科,面向对象编程和面向过程编程,我说说我的理解吧,面向对象不是有没有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()

现在可能有一点感觉了吧,如果后面我们在增加很多功能,比如唱歌,跳舞,如果使用面向过程的思想,就会显得很杂乱,所以在面向过程的时候通常会以模块来封装,而面向对象最小的单位就是类。
这就是整体性,其实也就是封装,面向对象是以对象的特点来进行构建编码的,而面向过程是以功能(函数)来进行构建编码的。而面向对象还支持抽象,继承等更强大的方式。这个后面讲了,所以总结,面向对象就是以构建对象(类似修房子)的逻辑进行编程的

0x2 类,实例,属性,方法,实例化,构造方法Self

类:是一个模板,比如老师,这是一类人物,通常我们把教书育人的人称为老师
实例: 具体的某一个老师,比如Mouse老师,很明显意味着老师的名字叫Mouse,当然也可以有Cat老师
属性:属性就是一个角色的属性(实在找不到更合适的词了),比如老师的名字,年龄。他告诉了我们类的特点
方法:就是类的功能,这个类可以做什么,比如老师可以教学
实例化:便是把类变成实例的过程,在这期间,我们把类(模板)中的属性赋予特定的值,让这个类变为具体的一个实例,python中的语法是类加括号比如这里的teacher()
构造方法:实例化时默认调用的方法,也称为初始化方法,Python的构造方法是__init__()
self:就是当前正在构造的类的实例

0x3 验证猜想

先定义一个类

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教程就到这里啦,下次再见

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/943153.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-18
下一篇 2022-05-18

发表评论

登录后才能评论

评论列表(0条)

保存