面向对象,全称面向对象程序设计,是一种软件开发方法。主要思路是把问题的各个事务分解为各个对象,各个对象之间相互独立,而相同的对象拥有统一的方法和属性,便于逐一击破解决问题。
抽象就是从众多事物中抽取出共同、本质性的特征1,你可以把它理解为一种创建出对象的方法和思路
对象就是拥有同一结构的集合,对象可以是变量、函数、数据结构等等,在python当中,一切皆为对象。
举一个例子,现在给你一批人,请判断谁最有可能写作业:
三十岁的大人、颐养天年的老人、初二的小朋友、二胎的妇女
我们可以很清楚的就猜到是初二的小朋友需要写作业,为什么呢,接下来我们用对象的定义和面向对象的方式来理解
解:
1、首先我们判断的事物是什么——是人
2、以上的人有哪些属性——抽象出性别、年龄、状态
3、创建你的基类和子类
接下来用python来实现一个简单的类定义来判断
class Person(object): # object是所有类的基类,手动继承可以自动获取object的方法
"""
人:所有人继承的基类
"""
def __init__(self, sex: str, age: int, stage: str):
"""
sex: str = ('man', 'female')
age: int > 0
stage: str = None # 当前对象的年龄状态
"""
self.sex = sex
self.age = age
self.stage = stage
class Adult(Person):
"""
成年人,定义为大于18岁
"""
def __init__(self, sex, age=18, stage='上班'):
super(Adult, self).__init__(sex, age, stage)
class Teenager(Person):
"""
小朋友,定义为小于18岁
"""
def __init__(self, sex, age=12, stage='学习,写作业'):
super(Teenager, self).__init__(sex, age, stage)
class Seniors(Person):
"""
老年人,定义为大于60岁
"""
def __init__(self, sex, age=60, stage='颐养天年'):
super(Adult, self).__init__(sex, age, stage)
class Gravida(Adult, Person):
"""
孕妇,性别为女,成年人,所有继承两个类
"""
def __init__(self, sex='female', age=22, stage='怀孕中,养胎'):
super(Gravida, self).__init__(sex, age, stage)
接下来我们打印一下这群人当下的状态,也就是他们现阶段主要做的事情
wm = Gravida()
ad = Adult('man')
teen = Teenager('man')
senior = Seniors('female')
>>> print('孕妇当前的主要状态: %5s' % wm.stage)
>>> print('成年人当前的主要状态: %5s' % ad.stage)
>>> print('小朋友当前的主要状态: %5s' % teen.stage)
>>> print('老年人当前的主要状态: %5s' % senior.stage)
孕妇当前的主要状态: 怀孕中,养胎
成年人当前的主要状态: 上班
小朋友当前的主要状态: 学习,写作业
老年人当前的主要状态: 颐养天年
状态这个属性是该群体主要做的事情,通过这个例子我们可以看到小朋友主要的任务就是学习,写作业巩固知识,积累经验。并且这里简单的实现了类的继承和定义。
当然这里是我们给该群体定义的stage,这个例子只是帮助我们快速的认识到我们在给类定义属性的时候要做的事情,因为我们是通过抽象该群体的主要的目标,当你要解决的问题比较复杂的时候,你就可以把它切割为各个对象来分析,这样你就可以从人这个群体拆解到具体的某个对象身上去
看到这里你应该对对象有了一定的理解,这里的例子我们用面向对象的思路去抽象你的问题,之后分解出简单的对象做分析
类是面向对象程序设计(OOP,Object-Oriented Programming)实现信息封装的基础。2
当你大概了解对象是什么概念之后,我们反过来看类会更直观一点。简单的说,我们的对象是通过实例化一个类创建出来的。也就是我们定义好一个类之后,它仅仅是一个模板,是未产生出我们的对象的状态,当我们对其实例化之后,就生成了对象
class Class(object):
pro1: str
def __init__(self, attr1):
self.attr1 = attr1
class1 = Class
obj1 = class1('attr1')
>>> print(class1)
<class '__main__.Class'>
>>> print(obj1)
<__main__.Class object at 0x7fec580c5a20>
这里我们看到第一条打印出来的提示是 class ,表明这只是一个单纯的类定义,是还未被实例化的,而第二行打印可以看到其内存信息,后面提示 0x7fec580c5a20
是其内存地址,当内存开辟了空间说明存储了一个对象了,无论是函数、方法还是变量
经过上面对类和对象的了解,我们在解决问题的时候可以把问题分解为对具体的某个对象来解决,这个思路就是面向对象开发,其步骤是先定义类,然后实例化得到一个对象
让我们一张图直观的了解一下对象和类以及他们的关系和属性
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qdKjxouU-1592155319697)(E:\Jola\wcplatform\pictures\object.jpg)]
图1 对象
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rFu4xfIW-1592155319700)(E:\Jola\wcplatform\pictures\class.jpg)]
图2 类
参考链接:
抽象的定义 ↩︎
类的定义 ↩︎