面向对象编程
一.函数式编程和面向对象的对比
1.请开发一个消息提醒功能(邮件/短信/微信)
函数: def email(em,text): """ 发送邮件 :return: """ print(em,text) def msg(tel,text): """ 发送短信 :return: """ print(tel,text) def wechat(num,text): """ 发送微信 :return: """ print(num,text) if 1 ==1: # 假设用户购买课程,然后给alex发送提醒 msg('188888888', '张进购买了一个学位课') email('alex@sb.com', '张进购买了一个学位课') wechat('xxxx', '张进购买了一个学位课')
面向对象: class Message: def email(self,em,text): """ 发送邮件 :return: """ print(em,text) def msg(self,tel,text): """ 发送短信 :return: """ print(tel,text) def wechat(self,num,text): """ 发送微信 :return: """ print(num,text) if 1 ==1: obj = Message() obj.msg('188888888', '张进购买了一个学位课') obj.email('alex@sb.com', '张进购买了一个学位课') obj.wechat('xxxx', '张进购买了一个学位课')
对比:
函数: 定义简单/调用简单
面向对象: 定义复杂/调用复杂,优点:归类,把某些类似的函数放在一起
总结:
1.函数式编程可能会比面向对象好
2.python中支持两种编程方式
3.面向对象方式格式:
定义:
class 类名: ----定义了一个类
def 函数名(self): ----在类中编写了一个"方法"
pass
调用:
x1= 类名() ----创建了一个对象/实例化一个对象
x1.函数名() ----通过对象调用其中一个方法
4.示例
class Account: def login(self): user = input("请输入用户名:") pwd = input("请输入密码:") if user == "alex" and pwd == "sb": print("登录成功") else: print("登录失败") obj = Account() obj.login()
2.打印
===========================函数版本============== """ 完成以下功能: 老狗/20岁/男/上山去砍柴 老狗/20岁/男/开车去东北 老狗/20岁/男/喜欢大宝剑 """ def kc(name,gender,age): data = "%s性别%s,今年%s岁,喜欢上山去砍柴" %(name,gender,age) print(data) def db(name,gender,age): data = "%s性别%s,今年%s岁,喜欢开车去东北" %(name,gender,age) print(data) def bj(name,gender,age): data = "%s性别%s,今年%s岁,喜欢大宝剑" %(name,gender,age) print(data) kc("老狗","男",20) db("老狗","男",20) bj("老狗","男",20)
面向对象: class LaoGou: def __init__(self,name,gender,age):# 特殊的方法,如果 类名() ,则该方法会被自动执行 (构造方法) self.n1 = name self.n2 = gender self.n3 = age def kc(self): data = "%s性别%s,今年%s岁,喜欢上山去砍柴" %(self.n1,self.n2,self.n3) print(data) def db(self): data = "%s性别%s,今年%s岁,喜欢开车去东北" %(self.n1,self.n2,self.n3) print(data) def bj(self): data = "%s性别%s,今年%s岁,喜欢大宝剑" %(self.n1,self.n2,self.n3) print(data) obj = LaoGou("老狗","男",20) obj.kc() obj.db() obj.bj()
总结:
1.构造方法
示例一:
class Foo:
def __init__(self,name): 构造方法,目的进行数据初始化.
self.name = name
self.age = 18
obj = Foo('侯明魏')
通过构造方法,可以将数据进行打包,以后使用时,去其中获取即可.
示例二:
class Bar:
pass
obj = Bar()
2.应用
1.将数据封装到对象中,以供自己在方法中调用
二.面向对象三大特性:继承 封装 多态
1封装
把方法封装到类中
把数据封装到类中
2.继承(python中有多继承和单继承)
将多个类共有的方法提取到父类中,子类仅需继承父类而不必一一实现每个方法。
3.多态(鸭子模型)
浙公网安备 33010602011771号