面向对象
1、步骤
OOA面向对象分析
OOD面向对象设计
OOP面向对象编程
def search_book(title):
print('搜索包含书关键词{}的图书'.format(title))
book = {
'title':'Python入门',
'price':39.00,
'author':"Peter",
'search_book':search_book
}
print(book['title'])
print(book.get('price', 0.0))
book.get('search_book')('Python') #在这个.get方法后面记得加上传递参数的值,因为调用的search_book函数这个需要输入参数
Python入门
39.0
搜索包含书关键词Python的图书
2、实现
分析对象特征行为
写类描述对象模板
实例化,模拟过程
import datetime
class Book: #长的命名就连在一起,在第二个单词开头大写,不在词中间添加下划线
def __init__(self,title,
price=0.0,
author='',
publisher=None,
pubdate=datetime.date.today()): #这种有一两个下划线开头结尾的叫预定义
self.title = title #定义了对象的特征
self.price = price
self.author = author
self.publisher = publisher
self.pubdate = pubdate
def __repr__(self):
return '<图书 {} at 0x{}>'.format(self.title,id(self))
def print_info(self):
print('当前这本书的信息如下:')
print('标题:{}'.format(self.title))
print('定价:{}'.format(self.price))
print('作者:{}'.format(self.author))
print('出版社:{}'.format(self.publisher))
print('出版时间:{}'.format(self.pubdate))
book1 = Book('C#精典',29.9,'Tom','优品课堂',datetime.date(2016,3,1))
book1.print_info()
当前这本书的信息如下:
标题:C#精典
定价:29.9
作者:Tom
出版社:优品课堂
出版时间:2016-03-01
book = Book('ASP.NET')
book.title
book.pubdate
book.price
book
'ASP.NET'
datetime.date(2019, 9, 4)
0.0
<图书 ASP.NET at 0x1935503916224>
3、特征
- 面向过程编程: 数据和处理数据的函数是彼此独立的,我们需要先将数据处理成函数能接受的格式,再调用相关函数处理
- 面向对象编程: 数据和处理数据的函数都在一个 类 中(Class),通过初始化 实例 (Instance)传递数据,通过实例调用对象方法或者说叫实例方法
封装
class Book: # 这里就是初始化你将要创建的实例的属性
count = 0
def __init__(self,title,price=0.0,author=None):#初始化执行
self.title = title
self.price = price
self.author = author
Book.count += 1 #写self跟实例有关,不写跟类有关
下面是定义你将要创建的实例所拥有的技能
def __del__(self): #删除对象执行
Book.count -= 1
def __repr__(self): #输入对象名显示内容(程序员用)
return '<图书:{} at 0x{}>'.format(self.title,id(self))
def __str__(self): #print(对象名)显示内容(用户用)
return '[图书: {},定价:{}]'.format(self.title,self.price)
def print_info(self):#在这个类函数里面加self的都是实例函数,与实例有关
print(self.title,self.price,self.author)
def static_method(cls):
print('类函数(对应类,但通过参数可访问实例')
def static_method(): #静态函数(逻辑上与实例无关),无self、cls参数
print('静态函数,逻辑上与实例无关')
if __name__ == '__main__': #当.py文件被直接运行时,if __name__ == '__main__'之下的代码块将被运行;当.py文件以模块形式被导入时,if __name__ == '__main__'之下的代码块不被运行。
book = Book('Python经典',price= 29.0,author='Tom')
book2 = Book('Flask')
book3 = Book('ASP.net')
book = static_method() #前面不加self,所以后面与实例无关,不用传入实例
import datetime
class Student:
def __init__(self,name,birthday): #本来可以直接设置age年龄这个属性,但是由于人的年龄是不断变化的
self.name = name
self.birthday = birthday
@property #类属性声明
def age(self):
return datetime.date.today().year - self.birthday.year
@age.setter #类属性设置声明,格式:@属性名.setter
def age(self,value):
raise AttributeError('禁止赋值年龄!')
@age.deleter # 类属性删除声明,格式:@属性名.deleter
def age(self):
raise AttributeError('年龄不能删除!')
if __name__ == '__main__':
s = Student('Tom', datetime.date(1992,3,1))
print(s.birthday)
print(s.age)
s.birthday = datetime.date(1982,8,2)
# del(s.name) #可以使用这种方法来删除属性
# print(s.name)
del(s.age) #年龄是另外赋值的,此属性已设置不能删除
print(s.age)
继承
import datetime
class Student:
def __init__(self,name,birthday): #本来可以直接设置age年龄这个属性,但是由于人的年龄是不断变化的
self.name = name
self.birthday = birthday
@property #类属性声明
def age(self):
return datetime.date.today().year - self.birthday.year
@age.setter #类属性设置声明,格式:@属性名.setter
def age(self,value):
raise AttributeError('禁止赋值年龄!')
@age.deleter # 类属性删除声明,格式:@属性名.deleter
def age(self):
raise AttributeError('年龄不能删除!')
if __name__ == '__main__':
s = Student('Tom', datetime.date(1992,3,1))
print(s.birthday)
print(s.age)
s.birthday = datetime.date(1982,8,2)
# del(s.name) #可以使用这种方法来删除属性
# print(s.name)
del(s.age) #年龄是另外赋值的,此属性已不能删除
print(s.age)
import datetime
class Department:
def __init__(self,department,phone,manager):
self.department = department
self.phone = phone
self.manager = manager
def __repr__(self):
return '<部门: {}>'.format(self.department)
class Employee:
def __init__(self,department:Department,name,birthday,salary):
self.department = department
self.name = name
self.birthday = birthday
self.salary = salary
@property
def age(self):
return datetime.date.today().year - self.birthday.year
def give_raise(self,percent,bonus=.0):
self.salary = self.salary * (1 + percent + bonus)
def __repr__(self):
return '<员工:{}>'.format(self.name)
def working(self):
print('员工:{}, 在工作...'.format(self.name))
class Programer(Employee): #继承上面的基类
def __init__(self,department,name,birthday,salary,specialty,project):
super().__init__(department,name,birthday,salary) #使用基类的初始化,然后这个类就不需再初始化了
self.specialty = specialty
self.project = project
def working(self): #重载,体现多态的特征
print('程序员: {}在开发项目:...'.format(self.name,self.project))
class HR(Employee):
def __init__(self,department,name,birthday,salary,qualification_level=1):
Employee.__init__(self,department,name,birthday,salary)
self.qualification_level = qualification_level
def working(self):
print('人事:{}正在面试新员工...'.format(self.name))
if __name__ == '__main__':
# p = Programer('技术部','Peter',datetime.date(1985,3,1),8000.0,'Python','CRM')
# print(p)
# print(p.department)
# print(p.salary)
# p.give_raise(.2,.1)
# print(p.salary)
# p.working()
# print(p.age)
# hr = HR('人事部','Marry',datetime.date(1992,4,4),6000,qualification_level=3)
# hr.give_raise(.1)
# print(hr.salary)
# hr.working()
dep = Department('技术部','010-23243','张三')
p = Programer(dep,'Peter',datetime.date(1990,2,3),23233,'Python,Flask','XMall')
p.give_raise(.2,.1)
print(p.salary)
print(p.department.department)
多态