python初识面向对象
类与对象的关系
类: 就是创建对象的第一步,先写类
对象: 通过类来创建对象
类是对某事物的归类(类就是对属性和方法的封装)
__init__(self, 参数): 参数一般作为属性设置给对象,对象就是self,对属性的封装,(根据需要,如果在类中传参就用__init__,如果不需要传参,就直在类里定义函数即可)
def 方法(self, 参数): 方法,第一个参数一般是固定的self,当前类的对象
创建类:
class 类名:
对象是某类型的一个具体
创建对象:
变量 = 类名() #实例化 <-> 创建对象
变量.属性 #访问对象的属性信息
变量.方法() #访问类中的方法
1 class 类名:
2 def __init__(self,值1,值2): # __init__(初始化方法,又被称为构造方法)
3 self.属性 = 值1
4 self.属性 = 值2
5
6 def 方法(self):
7 方法体
8 def 方法2(self):
9 方法体2
10
11 对象名 = 类名(值1,值2)
12 对象名.方法()
13 对象名.方法2()
创建类
1 class Car: #类名首字母大写,严格遵守变量命名规则
2 pass
3 c = Car() #创建对象,对象名=类名()
4 c.color = '红色' # 对象.属性(.意思就是'的')当属性不存在的时候,添加一个属性
5 c.pai = '京A88888'
6 c.color = '黑色' # 当属性存在的时候是修改属性信息(类似于字典根据key修改value)
7 print(c.color)
8 print(c.pai)
9 结果
10 红色
11 黑色
12 京A88888
创建一个类并调用这个类
__init__方法是一个特殊的方法,初始化方法(构造方法),在创建对象的时候,默认执行这个函数
在创建对象的时候会自动的调用__init__()
self就是创建出来的对象
1 class Car:
2 def __init__(self,color,pai):
3 self.a = color
4 self.pai = pai
5 def pao(self): #在类中写的函数就是方法,self当前类的对象
6 print('我%s的%s车能跑'%(self.a,self.pai))
7 def jump(self):
8 print('我的%s车能飞'%self.pai)
9 c=Car('红色','京A88888') # 创建Car类型对象c,self参数不需要管
10 c.pao()
11 c.jump()
12 c2 = Car('黑色','京B66666')
13 c2.pao()
14 c2.jump()
15 结果
16 我红色的京A88888车能跑
17 我的京A88888车能飞
18 我黑色的京B66666车能跑
19 我的京B66666车能飞
20
21 事例2,对象传参
22 class Car:
23 def __init__(self,color,pai):
24 self.a = color
25 self.pai = pai
26 def pao(self,ret):
27 print('我%s的%s车能跑%s'%(self.a,self.pai,ret))
28 def jump(self):
29 print('我的%s车能飞'%self.pai)
30 c=Car('红色','京A88888')
31 c.pao('太空')
32 c.jump()
33 结果
34 我红色的京A88888车能跑太空
35 我的京A88888车能飞
36
37
38 练习
39 用向对象的思维来模拟LOL里的盖伦上阵杀敌
40 class Hero:
41 def __init__(self,name,nickname):
42 self.name = name
43 self.nickname = nickname
44 def synopsis(self):
45 print('%s外号%s'%(self.name,self.nickname))
46 def q(self):
47 print('拎着大宝剑嗷嗷跑')
48 def w(self):
49 print('护盾')
50 def r(self):
51 print('大宝剑')
52 gw = Hero('盖伦','德玛西亚之力')
53 gw.synopsis()
54 gw.q()
55 gw.w()
56 gw.r()
57 结果
58 盖伦外号德玛西亚之力
59 拎着大宝剑嗷嗷跑
60 护盾
61 大宝剑
62
63 用向对象的思维来完成用户登录
64 class People:
65 def __init__(self,user,pwd):
66 self.user = user
67 self.passwd = pwd
68 def login(self):
69 use = input('user:')
70 password = input('passwd:')
71 if use == self.user and password == self.passwd:
72 print('登陆成功')
73 else:
74 print('登陆失败')
75 Lgin = People('bob','123')
76 Lgin.login()
面向对象和面向过程对比
脚本:(简单)
一切以事务的发展流程为中心
根据业务逻辑从上到下写垒代码
1 print('开冰箱门')
2 print('装大象')
3 print('关闭冰箱')
函数式(比脚本麻烦)
将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可
1 def kai():
2 print('开冰箱门')
3 def zhuang():
4 print('装大象')
5 def guan():
6 print('关闭冰箱')
7 kai()
8 zhuang()
9 zhuang()
10 guan()
面向对象:
一切以对象为中心,一切皆为对象,具体的某一个事务就是对象
对函数进行分类和封装,让开发"更快更好更强..."
对整个系统进行分析,分析出需要哪些对象,然后给对象进行归类
先写类,然后使用类创建对象,最后用对象去执行相关的操作
1 class Elephant:
2 def __init__(self):
3 print('创建大象')
4 def kai(self):
5 print('开冰箱门')
6 def zhuang(self):
7 print('装大象')
8 def guan(self):
9 print('关闭冰箱')
10 e = Elephant()
11 e.kai()
12 e.zhuang()
13 e.guan()
总结
脚本简单,不需要构思整个程序的概况
函数侧重的是功能,对功能有了概况
面向对象侧重的是归类
面向过程: 代码非常的冗余. 尤其是参数
面向对象的程序:
优点: 不需要像原来一样传递同样的参数了,结果相对清晰,可维护性好
缺点: 代码量比原来大,上手太难
应用场景:
如果写一些比较小的程序用面向过程
程序很复杂,很庞大建议用面向对象
python同时支持面向对象和面向过程:
面向过程: 应用程序相对比较小,不需要大规模的设计
面向对象: 程序非常大,项目管理维护成本很高,此时更适合用面向对象(结构)
封装
1. 对属性的封装
2. 对功能的封装
3. 模块的封装
4. 包的封装
1 class Game:
2 def login(self):
3 print("Game登录")
4 def recharge(self):
5 print("Game充钱")
6 def experience(self):
7 print("Game体验")
8 def uninstall(self):
9 print("Game卸载")
10
11 class Game2:
12 def recharge(self):
13 print("Game2充钱")
14 def uninstall(self):
15 print("Game2卸载")
16
17 class Game3:
18 def recharge(self):
19 print("Game3充钱")
20 def uninstall(self):
21 print("Game3卸载")
22
23 g = Game3()
24 g.uninstall()
25 结果
26 Game3卸载
继承
子类自动拥有父类中除了私有内容外的其他所有内容
继承目的: 对父类进行扩展
1 class Game:
2 def wan(self):
3 print('玩游戏')
4 class Game2(Game):
5 pass
6 game = Game2()
7 game.wan()
8 结果
9 玩游戏
10
11 事例2
12 class Game:
13 def wan(self):
14 print('玩游戏')
15 class Game2(Game):
16 def pay(self):
17 print('充钱')
18 game = Game2()
19 game.wan() #子类可以执行子类和父类中的方法
20 game.pay()
21
22 game = Game() #父类的对象不能执行子类中的功能
23 game.wan()
24 # game.pay() #因为Game是父类,所以不能执行子类中的方法(报错)
25 结果
26 玩游戏
27 充钱
28 玩游戏
29
30
31 事例3
32 class Game:
33 def wan(self):
34 print('玩游戏')
35 class Game2(Game): # 子类其实是对父类的一种扩展
36 def pay(self):
37 print('充钱')
38 def wan(self): # 子类中写了和父类一模一样的方法,这个叫方法的覆盖,重写
39 print('打怪升级')
40 game = Game2()
41 game.wan() # 类中的方法的查询顺序,先找自己,如果自己有这个方法就用自己的否则找父类
42 结果
43 打怪升级
44
45
46 python支持多继承
47 class Game:
48 def wan(self):
49 print('玩游戏')
50 class Game2(Game):
51 def pay(self):
52 print('充钱')
53 def wan(self):
54 print('打怪升级')
55 class Game3(Game2,Game): #哪个类在前优先使用哪个类
56 pass
57 game = Game3() #就近原则
58 game.wan()
59 结果
60 打怪升级
多态(同一个对象. 多种形态,我理解说白了,就是一大堆类中都有同样的方法,根据类把这些方法统一调用执行)
优点:超强的可扩展性,面向对象的核心就是多态
1 class Zoo:
2 def chi(self):
3 print('吃饭')
4 class Dog(Zoo):
5 def chi(self):
6 print('单身狗吃什么饭')
7 class Cat(Zoo):
8 def chi(self):
9 print('猫吃鱼')
10 class Tiger(Zoo):
11 pass
12
13 def Animal(dongwu):
14 dongwu.chi()
15
16 D = Dog()
17 C = Cat()
18 T = Tiger()
19
20 Animal(D)
21 Animal(C)
22 Animal(T)
23 结果
24 单身狗吃什么饭
25 猫吃鱼
26 吃饭
self.方法名() 可以自己调用自己的方法
1 class User:
2 def __init__(self,username,password):
3 self.username = username
4 self.password = password
5
6 class Account:
7 def __init__(self):
8 self.user_list = [] # 目的是存储用户信息
9
10 def login(self):
11 for i in range(3):
12 uname = input('<<<:')
13 upwd = input('<<:')
14 for u in self.user_list:
15 if uname == u.username and upwd == u.password:
16 print('ok')
17 return
18 else:
19 print('no')
20
21 def regist(self):
22 uname = input('>>:')
23 upwd = input('>>>:')
24 self.user_list.append(User(uname,upwd)) #调用User类并把uname和upwd变量作为参数传递进去,而且加入到self.user_list列表里
25
26 def run(self):
27 # 调用两次注册
28 self.regist() # 自己类中的方法互相调用,用self调用
29 self.regist()
30 # 一次登录
31 self.login()
32 obj = Account()
33 obj.run()
上题升级版
1 class User:
2 def __init__(self, username, password):
3 self.username = username
4 self.password = password
5 class Account:
6 def __init__(self):
7 pass
8 def login(self):
9 for i in range(3):
10 uname = input('用户名:')
11 upwd = input('密码:')
12 f = open('测试文件.txt',mode='r',encoding='utf-8')
13 for line in f:
14 lst = line.strip().split(':')
15 u = User(lst[0],lst[1]) #创建User对象u,因为'对象.属性名'可以调用此对象的属性,所以可以获取传入的用户名,密码
16 if uname == u.username and upwd == u.password:
17 print('ok')
18 return
19 else:
20 print('no')
21 def regist(self):
22 uname = input('>>:')
23 upwd = input('>>>:')
24 u = User(uname,upwd)
25 f = open('测试文件.txt',mode='a',encoding='utf-8')
26 f.write(u.username+':'+u.password+'\n')
27 f.close()
28
29 def run(self):
30 self.regist() #self可以自己调用自己
31 self.regist()
32 self.login()
33 obj = Account()
34 obj.run()

浙公网安备 33010602011771号