Python基础——面向对象(class)
面向对象(object oriented programming)是python语言的最核心部分,万物皆对象。
Eva_J这位大佬程序媛以人狗大战的游戏浅显易懂的讲述,强烈推荐。
文章目录
一、怎么理解面向对象,面向对象的优点???
1.怎么理解面向对象?
我们可以把我们身边的所有物品想象对Python中的对象即class,然后这个对象能做的事情即为class里面的函数。当我们想要使用某个物品做什么我们只需要针对某一物品给出相应的需求即可。
2.面向对象的优点
面向对象的出现极大的提高了编程的效率,使其编程的重用性增高。
3.面向过程 VS 面向对象
1)面向过程
面向过程的程序设计的核心是过程,即解决问题的步骤。面向过程的设计就好比是工厂的流水线,考虑好了一个产品生产过程中需要处理的所有东西。
2)面向对象
面向对象的程序设计的核心是对象,即需要解决的问题的特征。我们将一个物品拆分成多个特征,然后分别对每个特征进行处理,然后通过特征来区分各个物品的区别。
二、定义、封装、继承、多态
1.定义
对于Python中面向对象的定义,主要通过class类来实现。
class Person: #定义一个类
role = 'person'
def __init__(self, name): #初始化
self.name = name
def walk(self): #在类里面定义一个该类拥有的特征,即属性
print('name '%self.name,'is walking...')
2.封装
理解起来蛮简单的,就是把一个对象的各种特征封装到一个类中,然后用什么类的属性我们就调用哪个就好了。
class Person: #定义一个类
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex
def walk(self):
print('%s,%d岁,是个%s,is walking...'%(self.name,self.age,self.sex))
def eat(self):
print('%s,%d岁,是个%s,is eating...'%(self.name,self.age,self.sex))
def sleep(self):
print('%s,%d岁,是个%s,is sleeping...'%(self.name,self.age,self.sex))
a = Person('Simon',22,'男')
a.walk()
a.eat()
a.sleep()
print("*"*100)
b = Person('Mary',18,'女')
b.walk()
b.eat()
b.sleep()
'''
#Output
Simon,22岁,是个男,is walking...
Simon,22岁,是个男,is eating...
Simon,22岁,是个男,is sleeping...
****************************************************************************************************
Mary,18岁,是个女,is walking...
Mary,18岁,是个女,is eating...
Mary,18岁,是个女,is sleeping...
'''
3.继承
继承这一特征理解起来也是蛮容易的,就像我们人类中子女可以继承父母辈的财产一样。在Python中子类可以继承父类的一些属性。
比如我们常常说的一个大学生和猪的笑话:
大学生 = 吃+喝+睡+谈对象
猪 = 吃+喝+睡
class Public:
def eat(self):
print('%s is walking...'%(self.name))
def drink(self):
print('%s is drinking...'%(self.name))
def sleep(self):
print('%s is sleeping...'%(self.name))
class Univer_Person(Public):
def __init__(self,name):
self.name = name
def Fall_love(self):
print('%s is falling in love...'%(self.name))
class Pig(Public):
def __init__(self,name):
self.name = name
a = Univer_Person('Univer_Person')
a.Fall_love()
a.eat()
print('*'*100)
b = Pig('Pig_blue')
b.sleep()
'''
## Output
Univer_Person is falling in love...
Univer_Person is walking...
****************************************************************************************************
Pig_blue is sleeping...
'''
4.多态
学习Python的都应该知道,Python是一种不支持多态的语言,其本身也不需要去支持。因为其本身就可以实现多态,使用类的继承就可以实现鸭子类型。
三、面向对象的方法——静态方法/类方法/属性方法
Python中面向对象的方法主要是通过装饰器来实现。
1. 静态方法
静态方法,我们使用@staticmethod装饰器来实现。
通过该方式,把class类中的多个属性隔断开来,可以单独给某一个属性添加我们需要的参数。
class Person: #定义一个类
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex
def walk(self):
print('%s,%d岁,是个%s,is walking...'%(self.name,self.age,self.sex))
@staticmethod
def eat(name,age,sex):
print('%s,%d岁,是个%s,is eating...'%(name,age,sex))
@staticmethod
def sleep(name):
print('%s is sleeping...'%(name))
a = Person('Simon',22,'男')
a.walk()
a.eat('Mary',12,'女')
a.sleep('Hike')
'''
# output
Simon,22岁,是个男,is walking...
Mary,12岁,是个女,is eating...
Hike is sleeping...
'''
2. 类方法
类方法通过@classmethod来实现。
类方法不能访问实例变量(def __init__),只能访问类里面定义的变量
class Person: #定义一个类
name = 'Jiek'
age = 18
sex = '女'
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex
def walk(self):
print('%s,%d岁,是个%s,is walking...'%(self.name,self.age,self.sex))
@classmethod
def eat(self):
print('%s,%d岁,是个%s,is eating...'%(self.name,self.age,self.sex))
def sleep(self):
print('%s,%d岁,是个%s,is sleeping...'%(self.name,self.age,self.sex))
a = Person('Simon',22,'男')
a.walk()
a.eat()
a.sleep()
'''
# Output
Simon,22岁,是个男,is walking...
Jiek,18岁,是个女,is eating...
Simon,22岁,是个男,is sleeping...
'''
3. 属性方法
属性方法,我们通过装饰器@property来实现。
通过属性方法我们把类里面的一个方法变成一个静态属性,调用不再需要添加小括号。
class Person: #定义一个类
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex
def walk(self):
print('%s,%d岁,是个%s,is walking...'%(self.name,self.age,self.sex))
@property
def eat(self):
print('%s,%d岁,是个%s,is eating...'%(self.name,self.age,self.sex))
def sleep(self):
print('%s,%d岁,是个%s,is sleeping...'%(self.name,self.age,self.sex))
a = Person('Simon',22,'男')
a.walk()
a.eat
a.sleep()
'''
# Output
Simon,22岁,是个男,is walking...
Simon,22岁,是个男,is eating...
Simon,22岁,是个男,is sleeping...
'''
四、实战训练——图书管理系统
通过图书管理系统这个小项目,我们对Python面向对象的基本知识可以有个更加深刻的理解。这个小项目对理解面向对象蛮不错的!
# _*_coding:utf-8 _*_
"""
name: book1
date: 2018-07-23 8:05 AM (无敌热的一天,40度,没空调没风扇)
author: jay
desc:
功能描述:
1.图书管理系统中的用户分为三类:管理员,已注册学生和未注册学生
2.进入图书管理系统后首先选择身份,并且进行密码验证
管理员的密码唯一且给定;
学生的用户名和密码提前存储在字典中,以键和键值(键值对)的形式;
输入密码错误提示重新输入;
未注册学生先注册帐号,再进行登陆。
3.管理员的功能有(1)显示所有图书(2)增加图书(3)退出,可以循环输入操作
4.学生的功能有(1)显示所有图书(2)借书(3)还书(4)退出,可以循环输入操作
面向对象,类,对象,描述:
1.定义书类,保存书名,书的作者,书的数量(书的初始数量自由设定,大于0表示还有)和书所在的楼层
2.定义identity类,定义两种用户的认证方法
3.定义Menu类,定义两种用户的功能(静态方法),不用实例化对象就可调用
管理员用户有(1)查看所有图书(2)查找图书(3)增加图书(4)退出系统 4个功能
学生用户有 (1)查看所有图书(2)借阅图书(3)归还图书(4)退出系统 4个功能
4.定义choice类,里边保存管理员和用户的各种方法(全部定义为静态)
5.实例化书的对象,调用identity类中的方法
"""
from past.builtins import raw_input
class Book(object):
def __init__(self, name, author, count, place):
# 定义属性书名
self.name = name
# 定义属性书的作者
self.author = author
# 定义书的数量
self.count = count
# 定义书的位置,便于读者找到
self.place = place
def __str__(self):
if self.count == 0:
count = 'OUT'
else:
count ='IN'
return '%s' %(self.name)
class identity(object):
# 定义存储用户名和密码的字典
StudentDict = {'lily': '123',
'lucy': '456',
'jay': '789'}
# 定义静态方法选择身份
@staticmethod
def Choice():
print ('*' * 50)
print ('\033[5;31;2m\t\t\t\t欢迎使用图书管理系统\033[0m\n')
answer = raw_input(' 请选择您的身份:[1] 管理员 [2] 学生帐号 [3] 注册帐号\n')
if answer == '1':
# 如果选择是1,调用管理员的验证函数
identity.ManagerIdentity()
elif answer == '3':
# 如果选择是3,选择注册一个新的学生帐号,并调用验证函数登陆
name = raw_input('注册新用户———请输入您的姓名:')
code = raw_input('注册新用户———请输入您的密码:')
identity.StudentDict[name] = code
print ('***您已成功注册图书管理系统学生用户,请登陆:***')
identity.StudentIdentity()
elif answer =='2':
# 如果选择是2,调用学生用户的验证函数
identity.StudentIdentity()
else:
print ('***您的选择错误,不能登陆!***')
# 定义类方法验证管理员信息,管理员的密码是123456,身份唯一
@classmethod
def ManagerIdentity(cls):
# 管理员的验证函数
passwd1 = raw_input('请输入您的密码:')
print ('')
print ('*' * 50)
if passwd1 == '123456':
print ('\033[5;31;2m\t\t您的身份是管理员,欢迎进入图书管理系统\033[0m')
Menu.ManagerMenu()
else:
print ('您的密码错误!请重新输入:')
cls.ManagerIdentity()
# 定义类方法验证学生信息
@classmethod
def StudentIdentity(cls):
# 学生信息的验证函数
username =raw_input('请输入您的帐号:')
passwd2 = raw_input('请输入您的密码:')
print (' ')
print ('*' * 50)
for key in cls.StudentDict:
if (key == username and cls.StudentDict[key] == passwd2):
print ('\033[5;31;2m\t\t您的身份是学生,欢迎您进入图书管理系统\033[0m')
Menu.StudentMenu()
return
print ('您的用户名或身份不正确!请重新输入:')
cls.StudentIdentity()
class Menu(object):
# 定义菜单类,学生和管理员有不同的选择
@staticmethod
def StudentMenu():
# 定义学生选择菜单函数,这是静态方法,不用实例化对象即可调用
print ('')
print ('[1]查看所有藏书\n')
print ('[2]借阅图书\n')
print ('[3]归还图书\n')
print ('[0]退出系统\n')
while True:
studentchoice = raw_input('请选择您要进行的操作:')
if studentchoice == '1':
# 学生查看所有图书部分
choice.StudentSee()
elif studentchoice =='2':
# 学生借书部分
choice.StudentBorrow()
elif studentchoice == '3':
choice.StudentGive()
elif studentchoice =='0':
# 学生退出菜单部分
print ('')
print ('\033[5;31;2m***欢迎再次使用图书管理系统***\033[0m')
break
else:
print ('您的输入不正确,请输入[1]查看所有藏书[2]借书[3]还书[0]退出系统\n')
@staticmethod
def ManagerMenu():
# 定义管理员选择菜单函数
print ('')
print ('[1]查看所有藏书\n')
print ('[2]查询图书\n')
print ('[3]增加图书\n')
print ('[0]退出系统\n')
while True:
managerchoice = raw_input('请选择您要进行的操作:')
if managerchoice == '1':
# 管理员查看图书部分
choice.StudentSee()
elif managerchoice == '2':
# 管理员查询图书部分
choice.ManagerFind()
elif managerchoice == '3':
# 管理员增加图书部分
choice.ManagerAdd()
elif managerchoice == '0':
# 退出菜单部分
print ('')
print ('\033[5;31;2m***欢迎再次使用图书管理系统***\033[0m')
break
else:
print ('您的输入不正确,请输入[1]查看所有图书[2]查询图书[3]增加图书[0]退出系统\n')
class choice(object):
# 增加图书
@staticmethod
def ManagerAdd():
name = raw_input('请输入书籍的名称:')
author = raw_input('请输入书的作者:')
count = raw_input('请输入书的数量:')
place = raw_input('请输入书所在的楼层:')
BookList.append(Book(name, author, count, place))
print ('%s 添加成功!' % name)
print ('')
print ('图书馆所有的书籍有:')
# 调用StudentSee方法,显示图书馆中所有的书
choice.StudentSee()
# 查询图书
@staticmethod
def ManagerFind():
name = raw_input('请输入要查询的书名:')
for book in BookList:
if name == book.name :
print ('《%s》 作者:%s 数量:%s 楼层:%s!' % (name,book.author,book.count,book.place))
return book
else:
print ('《%s》没有找到!' % name)
return None
# 遍历图书馆中的所有书
@staticmethod
def StudentSee():
print ('图书馆中所有的书有:')
for book in BookList:
print ('《%s》 作者:%s \t数量:%s \t楼层:%s '% (book,book.author,book.count,book.place))
# 学生借书部分
@staticmethod
def StudentBorrow():
name = raw_input('请输入您想借阅的书名:')
BookResult = choice.ManagerFind()
if BookResult:
if BookResult.count == 0 or BookResult.count < 0:
print ('***该书已经被借出,请稍后再来!***')
else:
# BookResult.count > 0
print ('您已成功借到《%s》...' % name)
BookResult.count -= 1
else:
print ('抱歉,图书馆暂时没有《%s》这本书...' % name)
# 学生还书部分
@staticmethod
def StudentGive():
name = raw_input('请输入您要归还的书名:')
BookResult1 = choice.ManagerFind()
BookResult1.count += 1
print ('您的书已经归还成功,欢迎下次使用...')
# 类外主程序部分
# 定义一个存放书籍信息的列表
BookList = []
# 实例化初始书籍信息,存放在列表中
book1 = BookList.append(Book('C语言设计','齐朝怡',5,'1Floor'))
book2 = BookList.append(Book('人机交互','周杰伦',2, '2Floor'))
book3 = BookList.append(Book('数据库','方文山',1,'3Floor'))
# 调用identity类中的静态方法
identity.Choice()
本项目来自日入上万大佬做了些调试和修改。