面向对象简介
- a.面向过程:根据业务逻辑从上到下编写代码。
- b.函数式编程:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可。
- c.面向对象:对函数进行分类和封装。
注:java和C# 都只支持面向对象编程,python比较灵活即支持面向对象也支持函数式编程。
创建类和对象
面向对象编程时一种编程方式,通过使用“类”与“对象”来实现,所以面向对象其实就对“类”与“对象”的使用。
- a.类就是一个模板,模板可以包含多个函数,函数里实现一些功能。
- b.对象则是根据模板创建的实例,通过实例对象可以执行类中的函数。
1 class Foo: # class关键字,表示要创建类,类的名字为Foo 2 def bar(self): # def关键字,创建一个函数(也叫方法),bar是函数名,self为特殊参数必须有!!!self一般指向对象 3 pass # 函数内容 4 obj = Foo() # 根据类Foo创建对象obj 5 obj.bar() # 执行bar方法
面向对象和函数式编程执行一个函数区别
- a.面向对象:先创建对象,然后通过对象执行方法(函数)
- b.函数式:直接执行函数
# 看似函数式编程更加简单,实际不然,场景不同适用的编程方式也不同,函数式编程多用于各个函数之间独立且无共用的数据。
面向对象三大特性(封装,继承,多态)
1.封装
封装,将内容封装到某个地方,以后再去调用被封装在某处的内容。
1):将内容封装到某处
# 示例:
1 class Foo: # 创建类 2 def __init__(self, name, age): # 称为构造方法,根据类创建对象时自动执行,self代表了对象 3 self.name = name 4 self.age = age 5 def detail(self): # 创建一个detaill方法 6 print(self.name) 7 print(self.age)
# 流程:根据类Foo创建对象,自动执行Foo类的__init__方法
obj1 = Foo(‘wu‘, 22) # 将wu和22分别封装到obj1/self的name和age属性中
# 流程,每次实例化对象时,都会自动执行构造方法
obj2 = Foo(‘alex‘, 22) # 将alex和22分别封装到obe2/self的name和age属性中
# self是一个形式参数,当执行obj1时,self等于obj1;当执行obj2时,self等于obj2
2):从某处调用被封装的内容
调用被封装的内容时,有两种情况:
- a.通过对象直接调用:obj1.name # 直接调用obj1对象的name属性
- b.通过self间接调用:obj2.detail() # python默认将obj2传递给self,即:obj2.detail(obj2),方法内部self=obj2
综上所诉,对于面向对象的封装来说,其实就是使用构造方法将内容封装到对象中,然后通过直接或self间接获取封装内容。
2.继承
继承,面向对象中,子类可以继承父类,除了子类和父类还有称之为派生类和基类。叫法不同而已。
个人理解:子类将继承所有子类没有而父类有的所有方法和构造方法,当然如果子类和父类都有,则优先使用子类自己的,
在子类运行父类的方法或构造方法时,self指向还是自己的对象。
1).单继承
1 # 单继承代码格式: 2 class 父类: 3 def 父类的方法(self): 4 pass 5 class 子类(父类): # 在括号中写上索要继承的父类,子类继承了父类即拥有父类所有的方法 6 def 子类的方法(self): 7 pass 8 obj = 子类() # 创建子类的对象 9 obj.父类的方法() # 执行从父类继承的方法
2).多继承 # 多继承代码格式:
1.python的类可以继承多个类,java和C# 中只能继承一个类
2.python的类如果要继承多个类,那么在寻找方式有两种,分别是深度优先和广度优先
- 当类是经典类时,多继承情况下,会按照深度优先方式查找
- 当类时新式类时,多继承情况下,会按照广度优先方式查找
3.经典类和新式类,新式类包含了更多的功能,也是之后推荐的写法,从写法上区别,当前类或者父类继承了Obejct类,
那么该类便是新式类,否则便是经典类。
# 示例:
1 class C1: # C1是经典类 2 pass 3 class C2(object): # C2是新式类 4 pass 5 class C3(C2): # C3继承了C2,那么也是新式类 6 pass 7 class C4(C1): # C4继承了C1,那么也是经典类 8 pass 9 class C5(C2,C1): # C5继承了C2,C1两个父类,优先继承C2这个父类,按顺序继承 10 pass
3.多态
python不支持多态并且也用不到多态,多态用于java和C# 这一类强类型语言中,而Python崇尚“鸭子类型”
类的成员(字段,方法,属性)
1.字段
字段包含:普通字段和静态字段,在使用中有所区别,最本质的区别是内存中保存的位置不同。
普通字段属于:# 对象
静态字段属于:# 类
# 示例代码:
1 class Province: 2 # 静态字段 3 country = ‘中国‘ 4 5 def __init__(self,name): 6 # 普通字段 7 self.name = name 8 #直接访问普通字段 9 obj = Province(‘河北省‘) 10 print(obj.name) 11 #直接访问静态字段 12 Province.country
2.方法
方法包括:普通方法,静态方法和类方法,三种方法在内存中都归属于类,区别在于调用方式不同。