面向对象编程OOP

面向对象特征: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)
原文地址:https://www.cnblogs.com/shirleysu90/p/11986926.html