1、面向过程与面向对象
1.1、面向过程
什么是面向过程呢?
面向过程简而言之可以理解为面向解决步骤,比如:今天你要去新公司上班了,今天你要入职上班的步骤顺序就是面向过程。
1、带着身份证和录用通知单去前台报道。
2、前台核实了你的通知单带着你去找领导。
3、领导看着系统中你的信息,带你去找部门领导。
4、部门领导看了看你,安排你的组长带你。
5、你的组长安排了一个新师傅带你。
6、新师傅询问了你的技能,将公司的代码拷贝给你,让你熟悉。
7、你正式开始了你的工作。
从这一过程不难看出,面向过程是自上而下,逐步进行的,每一步都与前一步相关。
1.2、面向对象
对比于面向过程,面向对象就较为抽象了。
面向对象就是把一切事物看作一个个实体,实体的信息就是属性,实体的动作就是方法。
比如说:每个人就是一个个实体,我们的名字、性别、年龄等是固有的属性。我们的吃饭、走路、上班等是动作,也即方法。
所谓的面向对象就是模拟我们人类在真实环境中的境况。
因此面向对象的核心就是,先找到有哪些实体,然后找到与实体相匹配的动作。
如面向过程的例子;
1、实体有:我本人、公司、领导等。
2、信息(属性):
我:名字、性别、技能等。
公司:公司名、成立时间、主营业务等。
领导:领导名、领导负责的部门。
2、动作有:
我:报道、工作。
公司:招聘、提供就业岗位。
领导:工作、分配部门等。
面向对象就是拥有属性的不同实体,执行各自动作的过程。
2、类与对象
拥有相同(或者类似)属性和行为的对象都可以抽像出一个类。类的实例就是对象。类定义了对象都有的属性和行为。
语法:
class Types():
pass
类用class关键字标识,后面跟 类名(): ,这里的类名一般要见名知意且首字母大写。类中的逻辑在新的一行,并且使用缩进。
类的对象是什么呢?
T = Types()
这就是类的对象,也叫类的实例。
class Types():
pass
T = Types()
print(T)
print(type(T))
2.1、属性
使用变量来存储信息,这个变量就是其属性(或者叫字段)。
class Types():
pass
T = Types()
T.name = "XiaoLi"
print(T.name)
2.2、方法
类中的函数就是方法。
class Types():
pass
def test1(self):
print("test1")
T = Types()
T.test1()
注意:类中的函数必须添加一个self,这个self就是对象本身,用以指代自己。当然,你也可以不叫self,但第一个参数必须为其本身。
不带这个参数会报错。
若有其它参数,直接放置于self后面即可。
class Types():
pass
def test1(self,a,b):
print("test1",a,b)
T = Types()
T.test1(1,2)
既然,self指代了对象本身,我们可以在函数中输出这个对象的属性。
class Types():
pass
def test1(self,a,b):
print("test1",a,b)
def print_name(self):
print(self.name)
T = Types()
T.name = "XiaoLi"
T.print_name()
这里的self.name,其实就是T.name。
2.3、init函数
既然有属性,有方法,我的属性只能在对象化后添加吗?
当然不是,我们可以在对象化时同步添加。
Python的init函数就是专门来初始化这一过程的,其在Python内部已经写好,实例化类时自动执行init。
class Types():
def __init__(self,name,age):
self.name = name
self.age = age
def test1(self,a,b):
print("test1",a,b)
def print_name(self):
print(self.name,self.age)
T = Types("XiaoLi",20)
T.print_name()
3、类的继承
若两个类之间有共性,即:存在相似的属性和相似的方法。我们可以以其中一个类为模板,另一个类仿照这个类去简化代码。
class Father():
def __init__(self,name,age,time,company):
self.name = name
self.age = age
self.time = time
self.company = company
def go_work(self):
print(f"上班时间是:{self.time}")
def go_company(self):
print(f"去的公司是:{self.company}")
def name_age(self):
print(f"目前对象的名字:{self.name},目前对象的年龄:{self.age}")
class Child(Father):
def __init__(self,name,age,time,company,money):
super().__init__(name,age,time,company)
self.money = money
def print_money(self):
print(f"孩子的储蓄为{self.money}")
child = Child("Boy",20,"早上9点","腾讯",3000)
child.go_work()
child.go_company()
child.name_age()
child.print_money()
比如这个例子,孩子和父亲都有名字、年龄、上班时间和公司,只不过孩子多了个储蓄的属性。如果孩子类重新开始写,那任务量是非常大的,而孩子类中前四个属性和方法在父亲类中已经写好,因此孩子类直接继承父亲类即可。
注意:super方法是孩子类执行父类的__init__方法。
因此继承就是:若已有类实现了自己类的某些方法,自己类就不必再写了,直接复用已有类的方法。剩下的,专注于实现自己类的其它方法。
4、类的多态
所谓多态指的是允许不同类的对象对同一消息作出响应。换句话说,多态允许一个接口(或方法)被多个类型的实例所实现,并且可以在运行时动态地绑定到这些实例上。
class Father():
def __init__(self,name,age,time,company):
self.name = name
self.age = age
self.time = time
self.company = company
def go_work(self):
print(f"上班时间是:{self.time}")
def go_company(self):
print(f"去的公司是:{self.company}")
def name_age(self):
print(f"目前对象的名字:{self.name},目前对象的年龄:{self.age}")
def happy(self):
print("父亲爱打篮球")
class Child(Father):
def __init__(self,name,age,time,company,money):
super().__init__(name,age,time,company)
self.money = money
def print_money(self):
print(f"孩子的储蓄为{self.money}")
def happy(self):
print("儿子爱打游戏")
def people_happy(people):
people.happy()
father = Father("Bigboy",40,"早上8点50","阿里")
child = Child("Boy",20,"早上9点","腾讯",3000)
people_happy(father)
people_happy(child)
实际上多态利用到了类的继承和重写。
类的重写优先从本类中寻找,如果找不到会从父类中找,依次方法直到找不到,报错。