一、面向对象(OOP)的基本概念
(1)过程和函数
- 过程是早期的一个编程概念;
- 过程类似于函数,只能执行,但是没有返回值;
- 函数不仅能执行,还可以返回结果;
(2)面向过程----怎么做
- 把完成某一个需求的所有步骤从头到尾逐步实现;
- 根据开发需求,将某些功能独立的代码封装成一个又一个函数;
- 最后完成的代码,就是顺序地调用不同的函数。
特点:
1. 注重步骤与过程,不注重职责分工;
2. 如果需求复杂,代码会变得很复杂;
3. 开发复杂项目,没有固定的套路,开发难度很大!
(3)面向对象----谁来做
- 在完成某一个需求前,首先确定职责——要做的事情(方法);
- 根据职责确定不同的对象,在对象内部封装不同的方法(多个);
- 最后完成的代码,就是顺序地让不同的对象调用不同的方法。
以植物大战僵尸为例,僵尸以及植物等有如下性质:
(4)类和对象的概念
类是对一群具有相同特征或者行为的事物的一个统称,是抽象的,不能直接使用。
特征被称为属性,行为被称为方法;
对象是由类创建出来的一个具体存在,可以直接使用。
由哪一个类创建出来的对象,就拥有在哪一个类中定义的属性和方法。
(5)类和对象的关系
类是模板,对象是根据类这个模板创建出来的,应该先有类,再有对象。
类只有一个,而对象可以有很多个。
不同的对象之间属性可能会各不相同。
类中定义了什么属性和方法,对象中就有什么属性和方法,不可能多,也不可能少。
(6)类的设计
要设计一个类,通常需要满足一下三个要素:
1. 类名:这类事物的名字,满足大驼峰命名法,见文知意;
2. 属性:这类事物具有什么样的特征;
3. 方法:这类事物具有什么样的行为;
class TheFirstDemo:
'''这是一个学习Python定义的第一个类'''
# 构造方法
def __init__(self):
print("调用构造方法")
# 下面定义了一个类属性
add = 'hahahaha'
# 下面定义了一个say方法
def say(self, content):
print(content)
if __name__ == "__main__":
result = TheFirstDemo()
二、面向对象(OOP)的使用
(1)定义类
class 类名:
def 方法1(self,参数列表):
动作
def 方法2(self,参数列表):
动作
(2)创建对象
对象变量 = 类名()
练习:
需求:学生爱学习,学生爱跑步。
class Student:
def study(self):
print("我爱学习")
def run(self):
print("我爱跑步")
student01 = Student()
student01.study()
student01.run()
关于self:
由哪一个对象调用的方法,方法内的self就是哪一个对象的引用。
调用方法时,不需要传递self参数。
在方法内部,可以通过self访问对象的属性,也可以通过self调用对象的其它方法。
不推荐在类的外部给对象增加属性(对象包含哪些属性,应该封装在类的内部)。
例如:
student01.name = "张三"
(3)初始化方法
当使用 类名() 创建对象时,会自动执行初始化方法__init__,__init__是对象的内置方法。
在 Python 中,__init__ 也叫“构造器(Constructor)”。
__init__ 即“initialize(初始化)”,它的作用是将类的属性分配给每个对象。
例如:
class Student:
def __init__(self):
print("初始化一个学生")
student01 = Student()
(4)在初始化方法内部定义属性
在__init__方法内部使用 self.属性名=属性的初始值 可以定义属性,
定义属性后,再使用类创建对象,该对象就会拥有该属性。
例如:
class Student:
def __init__(self):
print("初始化一个学生")
self.name = "张三"
def study(self):
print("%s爱学习" %self.name)
student01 = Student()
student01.study()
(5)初始化的同时设置初始值
把希望设置的属性值,定义成__init__方法的参数;
在方法的内部使用 self.属性=形参 接收外部传递的参数;
在创建对象时,使用 类名(属性1,属性2......)调用。
例如:
class Student:
def __init__(self, input_name):
self.name = input_name
def study(self):
print("%s爱学习" % self.name)
student01 = Student("张三")
student01.study()
(6)__del__方法
如果希望对象在销毁前做一些事情,可以用__del__方法。
例如:
class Student:
def __init__(self, input_name):
self.name = input_name
print("我是%s" %self.name)
def __del__(self):
print("我消失了")
student01 = Student("张三")
(7)__str__方法
在python中,使用print输出对象变量时,默认情况下,会输出这个变量是由哪个类创建的对象,以及在内存中的地址(十六进制表示)。
如果在开发中,希望使用print输出对象变量时,能够打印自定义的内容,就可以用__str__这个内置方法。
(注意:__str__方法必须返回一个字符串)
例如:
class Student:
def __init__(self, input_name):
self.name = input_name
print("我是%s" %self.name)
def __del__(self):
print("我消失了")
def __str__(self):
return "%s同学" % self.name
student01 = Student("张三")
print(student01)
三、面对对象封装
1. 封装是面向对象编程的一大特点;
2. 面向对象编程的第一步 —— 将属性和方法封装到一个抽象的类中;
3. 外界使用类创建对象,然后让对象调用方法;
4. 对象方法的细节都被封装在类的内部;
练习:创建对象张三和李四,观察张三李四学习和玩对各自成绩的影响。
需求分析:
1. 学生张三李四
2. 张三成绩60分,李四成绩70分
3. 每次学习成绩增加5分
4. 每次打游戏学习成绩减少5分
class Student:
def __init__(self, input_name, input_score):
self.name = input_name
self.score = input_score
print("创建对象!%s的默认成绩是:%.1f" % (input_name, input_score))
def study(self):
print("%s努力学习一下!"%self.name)
self.score = self.score + 5
def play(self):
print("%s偷玩一下!"%self.name)
self.score = self.score - 5
def __str__(self):
return "%s的成绩是%.1f" % (self.name, self.score)
stu01 = Student("张三", 60)
stu02 = Student("李四", 70)
stu01.study()
print(stu01)
stu02.study()
print(stu02)
stu01.study()
print(stu01)
stu02.study()
print(stu02)
stu01.play()
print(stu01)
stu02.play()
print(stu02)
四、self
self 在定义类的方法时必须存在。
self 的作用是将类的方法分配给每个对象。
self 即“itself”,指类本身。
class student:
def __init__(self, new_name):
self.name = new_name
def print_name(self):
print("名字为:%s" % self.name)
stu01 = student("张三")
stu01.print_name()
stu02 = student("李四")
stu02.print_name()
输出结果:
五、继承
继承的语法:
class ClassName(baseclass):
statement
ClassName指的是子类或派生类名字,baseclass指的是父类或基类。
class person:
def print_info(self,input_name):
print("姓名是:"+input_name)
# student继承person
class student(person):
def __init__(self):
print("我是学生")
# teacher继承person
class teacher(person):
def __init__(self):
print("我是老师")
# 调用父类的方法
per01 = student()
per01.print_info("张三")
# 调用父类的方法
per02 = teacher()
per02.print_info("李四")