真正的面向对象编程
我们在前面已经和面向对象已经成为了深入交流后的好朋友了,那么我们是不是考虑要把关系更进一步了呢?
真正的面向对象编程
你的面向对象编程
是不是很真实?各位看官。
好了,引入就到这了,咱们今天还是来学习面向对象编程吧,今天是进阶篇,希望大家学会真正的面向对象编程就不愁没对象了。
面向对象高级篇
上次我们介绍面向对象的四大关键字意义及用法,还有类型中的常用魔法方法介绍。接下来我们再再深入了解面向对象的执行过程,还有进行一些简单的案例练习。
创建对象时的执行过程
首先我们需要知道在创建对象的时候会用到哪些方法?
之前我们在深交篇讲过对象创建会调用__new__()方法和__init__()方法,接下来咱们就来看看这个过程是怎样的?
顺序:申请空间–>创建对象–>属性初始化
类名()准备创建对象,申请内存空间–>调用__new__()方法,创建对象–>调用__init__()方法,对象初始化–>将创建好的对象赋值给等号左边的变量
流程图解:
注意:
面向对象之封装
封装的定义
封装是面向对象的一个非常重要的特征,主要体现的是对数据的保护。
封装的意义
因为每个对象都有可能存在保密的属性数据,就像生活中每个人都会存在自己的秘密,封装就是为了实现保密功能而存在的。
封装的步骤
①所有属性私有化
私有化,就是让属性编程当前对象自己的,不允许别人(类型、对象外其他类型、对象)直接访问。
属性私有化方法:
约定语法:变量使用一个下划线开头,项目规范中约定了这样的属性在类型和对象的外部不要直接去访问,但是空过对象的引用变量依旧可以访问。
实际语法:变量使用两个下划线开头,这是语法规则上定义的私有属性,在类型和对象的外部不能直接去访问。
但是这个时候我们会纳闷,如果私有属性访问不了那声明了就没有意义了呀。放心,python没那么笨好吧,往下看就知道了。
②私有属性的访问方法
python推荐了固定的语法规则,用于访问私有属性数据。
方法 | 描述 |
---|---|
set_私有属性() | 给私有属性赋值 |
get_私有属性() | 获取私有属性的数据 |
需要注意的是:设置的私有变量也需要在初始化方法中声明才行。
set 方法是用来给属性赋值的,init()方法也是给属性赋值的,有什么区别?
init()方法是给属性赋初值的,创建对象的同时初始化对象属性数据的。
set 方法是用来给已有的对象,修改对象属性数据使用的
面向对象之继承
什么是继承
继承是面向对象编程中的一个非常重要的特征,主要体现了类型代码中的复用性。
继承的意义
类型中的继承可以让两个或者多个类型之间产生继承关系,子类可以继承父类的属性和方法,即子类可以调用父类的属性和方法。
继承的语法
class 子类(父类):
子类中的代码
class Father:
"""父类"""
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
def eat(self):
print("我会吃饭")
class Son(Father):
"""子类"""
pass
tom = Son('tom', 18, "男")
print(tom.name, tom.age, tom.gender)
tom.eat()
可以看到Son类中是没有代码的,tom的属性和方法都来源于Father类型。这就是继承的语法。
子类继承了父类之后可以通过__base__方法访问父类的属性。
print(Son.__base__)
除了继承一个父类,面向对象继承的父类也可以是多个。
class Father:
"""父类"""
def run(self):
print("我会奔跑")
class Son(Father):
def run(self):
# Father.run(self)
# super().run()
print("我还会跳")
class Grandson(Son, Father):
pass
grandson = Grandson()
grandson.run()
继承之后调用父类的方法
方法一:通过父类名引用父类的方法
在子类中:
父类名.父类方法(self)
self表示子类对象
class Father:
"""父类"""
def run(self):
print("我会奔跑")
class Son(Father):
def run(self):
Father.run(self)
print("我还会跳")
son = Son()
son.run()
方法二:通过super().方法()
class Father:
"""父类"""
def run(self):
print("我会奔跑")
class Son(Father):
def run(self):
# Father.run(self)
super().run()
print("我还会跳")
son = Son()
son.run()
方法三:在类的外部调用父类的方法
class Father:
"""父类"""
def run(self):
print("我会奔跑")
class Son(Father):
def run(self):
# Father.run(self)
# super().run()
print("我还会跳")
son = Son()
son.run()
# super(子类, 子类对象).方法名
super(Son, son).run()
面向对象之多态
什么是多态?
多态是程序运行过程中,根据运行时的数据差异,产生笔筒的处理状态,运行不同的逻辑代码的过程。
多态作为面向对象的特征之一,没有固定的语法,主要体现为程序设计时考虑到的各种运行情况,以及运行过程中表现的多种状态的转换。
通俗的讲,多态就是多种状态,程序的体现就是,通过输入不同的代码,可以触发不同的方法。