面向对象特征:1、封装(对象具备行为能力写到方法里,便于重用和扩展,提高可维护性可扩展性)
2、继承 3、多态
class Book:#定义,Passic命名法,第一个字大写 def __init__(self,title,price,author):#类成员,写一个构造函数,下划线是预定义,逗号后面是传递初始化值 self.title = title#当前这本书的标题是你传过来的标题 self.price = price self.author = author def print_info(self):#加入一些行为 print(self.title,self.price,self.author) #以上的类只是一个模板,并不代表具体哪本书 #以下写入main方法 if __name__ == '__main__':#实例化的过程 book = Book('Python经典',price=20.0,author='Tom') book.print_info()
在console下
In[2]: import main In[3]: b = main.Book('Python') In[4]: b.price Out[4]: 0.0 In[5]: b Out[5]: <main.Book at 0x25428181f98>
想显示b具体的值 使用repr
class Book:#定义,Passic命名法,第一个字大写 def __init__(self,title,price=0.0,author=None):#类成员,写一个构造函数,下划线是预定义,逗号后面是传递初始化值 self.title = title#当前这本书的标题是你传过来的标题 self.price = price self.author = author def __repr__(self): #想返回具体信息 return '<图书:{}>'.format(self.title)#自己定义 def print_info(self):#加入一些行为 print(self.title,self.price,self.author) #以上的类只是一个模板,并不代表具体哪本书 #以下写入main方法 #if __name__ == '__main__':#实例化的过程 # book = Book('Python经典',price=20.0,author='Tom') # book.print_info()
console
In[6]: import importlib#再重新载入字符串 In[8]: importlib.reload(main) Out[8]: <module 'main' from 'D:\PycharmProjects\main.py'> In[9]: b = main.Book('ASP.net') In[10]: b Out[10]: <图书:ASP.net>
加入str
class Book:#定义,Passic命名法,第一个字大写 def __init__(self,title,price=0.0,author=None):#类成员,写一个构造函数,下划线是预定义,逗号后面是传递初始化值 self.title = title#当前这本书的标题是你传过来的标题 self.price = price self.author = author def __repr__(self): #想返回具体信息,调试的时候用 return '<图书:{} at ox{}>'.format(self.title,id(self))#自己定义 def __str__(self):#调用print呈现的结果,用str确定到底返回什么结果 return '[图书:{},定价:{}]'.format(self.title,self.price) def print_info(self):#加入一些行为 print(self.title,self.price,self.author) #以上的类只是一个模板,并不代表具体哪本书 #以下写入main方法 #if __name__ == '__main__':#实例化的过程 # book = Book('Python经典',price=20.0,author='Tom') # book.print_info()
console
In[11]: importlib.reload(main) Out[11]: <module 'main' from 'D:\PycharmProjects\main.py'> In[12]: b = main.Book('c#') In[13]: b Out[13]: <图书:c# at ox2560473611736> #at是显示内存地址 In[14]: print(b) #给普通用户看 [图书:c#,定价:0.0]
对象的理解
应用count
class Book:#定义,Passic命名法,第一个字大写 count = 0 #计算书数量 def __init__(self,title,price=0.0,author=None):#类成员,写一个构造函数,下划线是预定义,逗号后面是传递初始化值 self.title = title#当前这本书的标题是你传过来的标题 self.price = price self.author = author def __repr__(self): #想返回具体信息 return '<图书:{} at ox{}>'.format(self.title,id(self))#自己定义 def __str__(self):#调用print呈现的结果 return '[图书:{},定价:{}]'.format(self.title,self.price) def print_info(self):#加入一些行为 print(self.title,self.price,self.author) # 以上的类只是一个模板,并不代表具体哪本书 # 以下写入main方法 if __name__ == '__main__':#实例化的过程 book = Book('Python经典',price=20.0,author='Tom') Book.count += 1 #第一本创建完这么写 book2 = Book('Flask') Book.count += 1#用类取到,而不是实例取到 book3 = Book('ASP.net') Book.count += 1 print('图书数量:{}'.format(Book.count))#打印目前图书数量
实现自己加1
class Book:#定义,Passic命名法,第一个字大写 count = 0 #计算书数量 def __init__(self,title,price=0.0,author=None):#类成员,写一个构造函数,下划线是预定义,逗号后面是传递初始化值 self.title = title#当前这本书的标题是你传过来的标题 self.price = price self.author = author Book.count += 1 def __repr__(self): #想返回具体信息 return '<图书:{} at ox{}>'.format(self.title,id(self))#自己定义 def __str__(self):#调用print呈现的结果 return '[图书:{},定价:{}]'.format(self.title,self.price) def print_info(self):#加入一些行为 print(self.title,self.price,self.author) # 以上的类只是一个模板,并不代表具体哪本书 # 以下写入main方法 if __name__ == '__main__':#实例化的过程 book = Book('Python经典',price=20.0,author='Tom') book2 = Book('Flask') book3 = Book('ASP.net') print('图书数量:{}'.format(Book.count))#打印目前图书数量
销毁一本书:del
class Book:#定义,Passic命名法,第一个字大写 count = 0 #计算书数量 #初始化执行 def __init__(self,title,price=0.0,author=None):#类成员,写一个构造函数,下划线是预定义,逗号后面是传递初始化值 self.title = title#当前这本书的标题是你传过来的标题 self.price = price self.author = author Book.count += 1 #删除对象执行 def __del__(self): Book.count -= 1 #控制台直接写对象执行 def __repr__(self): #想返回具体信息 return '<图书:{} at ox{}>'.format(self.title,id(self))#自己定义 #打印时执行 def __str__(self):#调用print呈现的结果 return '[图书:{},定价:{}]'.format(self.title,self.price) def print_info(self):#加入一些行为 print(self.title,self.price,self.author) # 以上的类只是一个模板,并不代表具体哪本书 # 以下写入main方法 if __name__ == '__main__':#实例化的过程 book = Book('Python经典',price=20.0,author='Tom') book2 = Book('Flask') book3 = Book('ASP.net') del (book3) print('图书数量:{}'.format(Book.count))#打印目前图书数量
类函数,不加self的,跟实例无关,只是一个占位符
class Book:#定义,Passic命名法,第一个字大写 count = 0 #计算书数量 #初始化执行 def __init__(self,title,price=0.0,author=None):#类成员,写一个构造函数,下划线是预定义,逗号后面是传递初始化值 self.title = title#当前这本书的标题是你传过来的标题 self.price = price self.author = author Book.count += 1 #删除对象执行 def __del__(self): Book.count -= 1 #控制台直接写对象执行 def __repr__(self): #想返回具体信息 return '<图书:{} at ox{}>'.format(self.title,id(self))#自己定义 #打印时执行 def __str__(self):#调用print呈现的结果 return '[图书:{},定价:{}]'.format(self.title,self.price) def print_info(self):#加入一些行为 print(self.title,self.price,self.author) def cls_method(cls): print('类函数') # 以上的类只是一个模板,并不代表具体哪本书 # 以下写入main方法 if __name__ == '__main__':#实例化的过程 book = Book('Python经典',price=20.0,author='Tom') book2 = Book('Flask') book3 = Book('ASP.net') Book.cls_method(book2) #类函数与实例无关,括号里是获取信息
class Book:#定义,Passic命名法,第一个字大写 count = 0 #计算书数量 #初始化执行 def __init__(self,title,price=0.0,author=None):#类成员,写一个构造函数,下划线是预定义,逗号后面是传递初始化值 self.title = title#当前这本书的标题是你传过来的标题 self.price = price self.author = author Book.count += 1 #删除对象执行 def __del__(self): Book.count -= 1 #控制台直接写对象执行 def __repr__(self): #想返回具体信息 return '<图书:{} at ox{}>'.format(self.title,id(self))#自己定义 #打印时执行 def __str__(self):#调用print呈现的结果 return '[图书:{},定价:{}]'.format(self.title,self.price) def print_info(self):#加入一些行为 print(self.title,self.price,self.author) def cls_method(cls): print('类函数') def static_method():#如果跟类无关括号里什么都不加就可以 print('静态函数,逻辑上与实例无关') # 以上的类只是一个模板,并不代表具体哪本书 # 以下写入main方法 if __name__ == '__main__':#实例化的过程 book = Book('Python经典',price=20.0,author='Tom') book2 = Book('Flask') book3 = Book('ASP.net') Book.cls_method(book2) #类函数与实例无关 Book.static_method()
class Book:#定义,Passic命名法,第一个字大写 count = 0 #计算书数量 #初始化执行 def __init__(self,title,price=0.0,author=None):#类成员,写一个构造函数,下划线是预定义,逗号后面是传递初始化值 self.title = title#当前这本书的标题是你传过来的标题 self.price = price self.author = author Book.count += 1 #删除对象执行 def __del__(self): Book.count -= 1 #控制台直接写对象执行 def __repr__(self): #想返回具体信息 return '<图书:{} at ox{}>'.format(self.title,id(self))#自己定义 #打印时执行 def __str__(self):#调用print呈现的结果 return '[图书:{},定价:{}]'.format(self.title,self.price) def print_info(self):#加入一些行为 print(self.title,self.price,self.author) def cls_method(cls): print('类函数') @staticmethod #和实例无关,一般不加 def static_method(): #目标就是摆脱和实例的关系 print('静态函数,逻辑上与实例无关') # 以上的类只是一个模板,并不代表具体哪本书 # 以下写入main方法 if __name__ == '__main__':#实例化的过程 book = Book('Python经典',price=20.0,author='Tom') book2 = Book('Flask') book3 = Book('ASP.net') Book.cls_method(book2) #类函数与实例无关 Book.static_method() book2.static_method()
import datetime 运行不了 class Student: def __init__(self,name,age,birthdate): self.name = name self.age = age self.birthdate=birthdate if __name__ == '__main__': s = Student('Tom',20,datetime.date(1992,3,1)) print(s.age) print(s.birthdate)
运行不了
import datetime class Student: def __init__(self,name,birthdate): self.name = name #self.age = age self.birthdate=birthdat #想看年龄,传时没传,后来想看 def get_age(self): return datetime.date.today().year - self.birthdate.year if __name__ == '__main__': s = Student('Tom',datetime.date(1992,3,1)) #print(s.age) print(s.birthdate) print(s.get_age())
@property#写个装饰器,表明属性
import datetime class Student: def __init__(self,name,birthdate): self.name = name #self.age = age self.birthdate=birthdat @property#写个装饰器,表明属性 def age(self): return datetime.date.today().year - self.birthdate.year if __name__ == '__main__': s = Student('Tom',datetime.date(1992,3,1)) #print(s.age) print(s.birthdate) print(s.age)
@property#写个装饰器,表明属性 def age(self): return datetime.date.today().year - self.birthdate.year @age.setter def age(self,value): raise AttributeError('禁止赋值年龄!') @age.deleter def age(self): #删除 raise AttributeError('年龄不能删除')
特征:
封装:对象具备行为写入函数,行为定义成方法写成类
继承:两个类多个类之间有重叠的部分,有继承的关系,用代码实现
多态:属于同一类型的不同实例,同一消息的不同响应能力
属性:
算面积
import math class Circle: def __init__(self,radius): #圆 self.radius = radius def get_area(self):#算面积 return math.pi * self.radius ** 2 c = Circle(4.0) print("圆的面积是:{}".format(c.get_area()))
@property
import math class Circle: def __init__(self,radius): #圆 self.radius = radius @property#属性本质是个函数,但是用起来是个字段,加这个具备计算功能 def area(self): return math.pi * self.radius ** 2 #取得math模块pi的自身r方 # def get_area(self):#算面积 # return math.pi * self.radius ** 2 c = Circle(4.0) print("圆的面积是:{}".format(c.area)) #像调一个字段
类间的关系继承保护关系
模拟公司内部员工工作场景
继承
class Employee: def __init__(self,department,name,birthdate,salary): self.department = department self.name = name self.birthdate = birthdate self.salary = salary def __repr__(self):#显示基本信息 return '<员工:{}>'.format(self.name) def working(self):#工作行为 print('员工:{},在工作...'.format(self.name)) #基类处理 #子类处理 class Programer(Employee):#直接继承,继承employee def __init__(self,department,name,birthdate,salary,specialty,project): super().__init__(department,name,birthdate,salary)#基类,调用init里,交给上面的代码完成 self.specialty = specialty self.project = project def working(self):#重写,重载,体现多态特征 print('程序员:{}在开发项目:{}...'.format(self.name,self.project))
In[2]: import main In[3]: import datetime In[4]: import importlib In[5]: p = main.Programer('技术部','Peter',datetime.date(1990,3,1),8000,'Python','CRM') In[6]: p Out[6]: <员工:Peter> In[7]: p.salary Out[7]: 8000 In[8]: p.specialty Out[8]: 'Python' In[9]: p.working() 程序员:Peter在开发项目:CRM...
import datetime class Employee: def __init__(self,department,name,birthdate,salary): self.department = department self.name = name self.birthdate = birthdate self.salary = salary 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):#直接继承,继承employee def __init__(self,department,name,birthdate,salary,specialty,project): super().__init__(department,name,birthdate,salary)#基类,调用init里,交给上面的代码完成 self.specialty = specialty self.project = project def working(self):#重写,重载,体现多态特征 print('程序员:{}在开发项目:{}...'.format(self.name,self.project)) if __name__ == '__main__': p = Programer('技术部','Peter',datetime.date(1990,3,3),8000,'Flask','CRM') print(p) print(p.department) print(p.salary) p.give_raise(.2,.1) print(p.salary)
import datetime class Employee: def __init__(self,department,name,birthdate,salary): self.department = department self.name = name self.birthdate = birthdate self.salary = salary @property#定义属性 def age(self): return datetime.date.today().year - self.birthdate.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):#直接继承,继承employee def __init__(self,department,name,birthdate,salary,specialty,project): super().__init__(department,name,birthdate,salary)#基类,调用init里,交给上面的代码完成 self.specialty = specialty self.project = project def working(self):#重写,重载,体现多态特征 print('程序员:{}在开发项目:{}...'.format(self.name,self.project)) if __name__ == '__main__': p = Programer('技术部','Peter',datetime.date(1990,3,3),8000,'Flask','CRM') print(p) print(p.department) print(p.salary) p.give_raise(.2,.1) print(p.salary) p.working()
print(p.age)
import datetime class Employee: def __init__(self,department,name,birthdate,salary): self.department = department self.name = name self.birthdate = birthdate self.salary = salary @property#定义属性 def age(self): return datetime.date.today().year - self.birthdate.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):#直接继承,继承employee def __init__(self,department,name,birthdate,salary,specialty,project): super().__init__(department,name,birthdate,salary)#基类,调用init里,交给上面的代码完成 self.specialty = specialty self.project = project def working(self):#重写,重载,体现多态特征 print('程序员:{}在开发项目:{}...'.format(self.name,self.project)) class HR(Employee): def __init__(self,department,name,birthdate,salary,qualification_level=1): Employee.__init__(self,department,name,birthdate,salary)#调用init写 self.qualification_level = qualification_level def working(self): print('人事:{}正在面试新员工'.format(self.name)) if __name__ == '__main__': p = Programer('技术部','Peter',datetime.date(1990,3,3),8000,'Flask','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()
类间的关系
把部门单独拿出写个类
import datetime class Department: def __init__(self,department,phone,manager): self.department = department self.phone = phone self.manager = manager class Employee: def __init__(self,department:Department,name,birthdate,salary):#:depart员工接收上面depart信息 self.department = department self.name = name self.birthdate = birthdate self.salary = salary @property#定义属性 def age(self): return datetime.date.today().year - self.birthdate.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):#直接继承,继承employee def __init__(self,department,name,birthdate,salary,specialty,project): super().__init__(department,name,birthdate,salary)#基类,调用init里,交给上面的代码完成 self.specialty = specialty self.project = project def working(self):#重写,重载,体现多态特征 print('程序员:{}在开发项目:{}...'.format(self.name,self.project)) class HR(Employee):#派生类 def __init__(self,department,name,birthdate,salary,qualification_level=1): Employee.__init__(self,department,name,birthdate,salary)#调用init写 self.qualification_level = qualification_level def working(self): print('人事:{}正在面试新员工'.format(self.name)) if __name__ == '__main__': dep = Department('技术部','01-87718391','张大三')#游离在内存外的单独实例 p = Programer(dep,'Peter',datetime.date(1990,3,3),8000,'Python,Flask','XMall') #构造一个程序员 p.give_raise(.2,.1) print(p.salary)
显示
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,birthdate,salary):#:depart员工接收上面depart信息 self.department = department self.name = name self.birthdate = birthdate self.salary = salary @property#定义属性 def age(self): return datetime.date.today().year - self.birthdate.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):#直接继承,继承employee def __init__(self,department,name,birthdate,salary,specialty,project): super().__init__(department,name,birthdate,salary)#基类,调用init里,交给上面的代码完成 self.specialty = specialty self.project = project def working(self):#重写,重载,体现多态特征 print('程序员:{}在开发项目:{}...'.format(self.name,self.project)) class HR(Employee):#派生类 def __init__(self,department,name,birthdate,salary,qualification_level=1): Employee.__init__(self,department,name,birthdate,salary)#调用init写 self.qualification_level = qualification_level def working(self): print('人事:{}正在面试新员工'.format(self.name)) if __name__ == '__main__': dep = Department('技术部','01-87718391','张大三')#游离在内存外的单独实例 p = Programer(dep,'Peter',datetime.date(1990,3,3),8000,'Python,Flask','XMall') #构造一个程序员 p.give_raise(.2,.1) print(p.salary) print(p.department.department)