Python从0到100(十六):面向对象编程入门
一、面向对象编程概述
1.1面向对象编程定义
🐒🐒🐒面向对象的编程,顾名思义就是面向你的男朋友or女朋友(俗称对象),去进行编程! 这时候有的小伙伴会问啦:那我没对象怎么面向对象编程呢~
答:这个时候你可以跳过面向对象编程,去学习面向单身狗编程
哈哈哈,开个玩笑,那什么是真正的面向对象编程呢?🙈🙈🙈
⏬ 定义⏬
在现实世界中存在各种不同形态的事物,这些事物之间存在着各种各样的联系。在程序中使用对象来映射现实中的事物,使用对象间的关系来描述事物之间的联系,这种思想就是面向对象。
1.2面向过程and面向对象
分别使用面向过程和面向对象来实现五子棋:
1.面向过程:
开始游戏➡️黑子先走➡️绘制画面➡️轮到白子➡️绘制画面➡️判断输赢➡️返回步骤2➡️输出最后结果⬇️⬇️⬇️
即:先分析解决问题的步骤➡️使用函数把这些步骤以此实现➡️用的时候需要逐个调用函数
2.面向对象:
黑白双方:这两方的行为一样➡️棋盘系统:负责绘制画面➡️规则系统:负责判断诸如犯规、输赢等⬇️⬇️⬇️
即:把解决问题的事物分为多个对象➡️➡️➡️对象具备解决问题过程中的行为
⚠️⚠️⚠️ 若加入悔棋功能,面向过程和面向对象,分别怎么实现呢?
⏪面向过程⏩:从输入到判断到显示的一系列步骤都需要改动🔝🔝🔝
⏪面向对象⏩:只需要改动棋盘对象就可以🔄🔄🔄
二、类和对象
2.1类和对象的关系
面向对象编程有两个非常重要的概念:类和对象。 对象是面向对象编程的核心。
具有相似特征和行为的事物的集合统称为类。 对象是根据类创建的,一个类可以对应多个对象。
🔹可以把玩具模型看作一个类
🔸把每个玩具看作一个对象
2.2类的定义
⏬ 定义⏬
类是由3部分组成的:
- 🕐类的名称:类名。
- 🕧类的属性:一组数据,比如性别。
- 🕤类的方法:允许进行操作的方法,比如说话。
使用class关键字来声明一个类,基本格式如下:
⏪语法格式⏩
class 类名:
类的属性
类的方法
2.3根据类创建对象
1.根据类创建对象
的语法格式如下:
⏪语法格式⏩
对象名 = 类名()
2.要想给对象添加属性
,可以通过如下方式:
⏪语法格式⏩
对象名.新的属性名 = 值
三、构造方法
3.1构造方法
⏬ 定义⏬
构造方法指的是 __init__方法。
当创建类的实例的时候,系统会自动调用构造方法,从而实现对类进行初始化的操作。
⏪语法格式⏩
class Car:
def __init__(self):
self.color = '黑色'
def toot(self):
print("%s的车在鸣笛..."%(self.color))
◀️ 调用⬇️方法 ▶️
bmw = Car()
bmw.toot()
3.2析构方法
⏬ 定义⏬
当删除一个对象来释放类所占用资源的时候,Python解释器默认会调用另外一个方法,这个方法就是__del__( )方法。
__del__方法被称为析构方法。
四、self的使用
⏬ 定义⏬
在方法的列表中,第1个参数永远都是self。
♨️self的字面意思是自己,我们可以把它当做C++里面的this指针理解,表示的是对象自身。
当某个对象调用方法的时候,Python解释器会把这个对象作为第1个参数传给self,开发者只需要传递后面的参数就可以了。
⏪语法格式⏩
class Dog:
def __init__(self, newColor):
self.color = newColor
def printColor(self):
print("颜色为:%s"%self.color)
◀️ 调用⬇️方法 ▶️
dog1 = Dog("白色")
dog1.printColor()
五、封装
⏬ 定义⏬
封装,顾名思义就是将内容封装到某个地方,以后再去调用被封装在某处的内容。
♨️对于面向对象的封装来说,其实就是使用构造方法将内容封装到 对象 中,然后通过对象直接或者self间接获取被封装的内容。
⏪语法格式⏩
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
laowang = Person('徐', 30)
laowang.age = 300
print(laowang.age)
# 300
⚠️人的年龄可以随便设置,显然不可行⚠️
为了保护类里面的属性,可以采用如下方式解决:
📍把属性定义为私有属性,即在属性名的前面加上两个下划线;
📍添加用于设置或获取属性值的两个方法供外界调用。
六、继承
⏬ 定义⏬
✅在现实生活中,继承一般指的是子女继承父辈的财产。
✅在程序中,继承描述的是事物之间的所属关系。
6.1单继承
类的继承是指在一个现有类的基础上构建一个新的类,构建出来的新类被称作子类。
⬅️波斯猫和巴厘猫都继承自猫,而沙皮狗和斑点狗都继承狗➡️
Python程序中,继承使用如下语法格式标注:
⏪语法格式⏩
class 子类名(父类名):
假设有一个类为A,A派生出来了子类B,示例如下:
⏪语法格式⏩
class B(A):
class A(object):
⚠️默认是继承自object的⚠️
6.2 多继承
现实生活中,一个派生类往往会有多个基类。比如沙发床是沙发和床的功能的组合,这都是多重继承的体现。
⚓️Python支持多继承,多继承就是子类拥有多个父类,并且具有它们共同的特征,即子类继承了父类的方法和属性。⚓️
⬅️水鸟拥有了鱼和鸟的特征 ➡️
多继承可以看做是单继承的扩展,语法格式如下:
⏪语法格式⏩
class 子类名(父类1,父类2…):
⬅️如果子类继承的多个父类间是平行的关系,子类先继承的哪个类就会调用哪个类的方法。➡️
七、多态
⏬ 定义⏬
多态的概念其实不难理解,它是指对不同类型的变量进行相同的操作,它会根据对象(或类)类型的不同而表现出不同的行为。
7.1Python中多态的作用
让具有不同功能的函数可以使用相同的函数名,这样就可以用一个函数名调用不同内容(功能)的函数。
7.2Python中多态的特点
🌕1、只关心对象的实例方法是否同名,不关心对象所属的类型;
🌖2、对象所属的类之间,继承关系可有可无;
🌗3、多态的好处可以增加代码的外部调用灵活度,让代码更加通用,兼容性比较强;
🌘4、多态是调用方法的技巧,不会影响到类的内部设计。
⏪语法格式⏩
⌛️A类:
class A(object):
def test(self):
print("--A--test")
⏳B类:
class B(A):
def test(self):
print("--B--test")
📈代码展示 📉
class A(object):
def test(self):
print("--A--test")
class B(A):
def test(self):
print("--B--test")
def func(temp):
temp.test()
a = A()
b = B()
func(a)
func(b)
# --A--test
# --B--test
八、类属性和实例属性
8.1类属性
⏰类属性是类所拥有的属性
,它需要在类中进行显示地定义(位于类内部,方法的外面),它被所有类的实例对象所共有,在内存中只存在一个副本。
⏪语法格式⏩
class Cat(object):
#类属性
num = 0
8.2实例属性
⏰通过“实例.属性”
添加属性的属性都是实例属性。
⏪语法格式⏩
def __init__(self):
#实例属性
self.age = 1
九、类方法和静态方法
9.1类方法
📧使用修饰器 @classmethod来标识类方法📧
⏪语法格式⏩
class 类名:
@classmethod
def 类方法名(cls):
方法体
🎯要想调用类方法,既可以通过对象名调用类方法,又可以通过类名调用类方法
,这两种方法没有任何区别。
9.2静态方法
📧使用修饰器 @staticmethod来标识静态方法📧
class 类名:
@staticmethod
def 静态方法名():
方法体
✳️静态方法是没有self参数,在静态方法中无法访问实例变量
。
💟静态方法中不可以直接访问类属性,但是可以通过类名引用类属性
。
✴️静态方法跟定义它的类没有直接关系
,只是起到了类似函数的作用。
十、面向对象应用
1.定义一个类描述数字时钟。
import time
# 定义数字时钟类
class Clock(object):
"""数字时钟"""
def __init__(self, hour=0, minute=0, second=0):
"""初始化方法
:param hour: 时
:param minute: 分
:param second: 秒
"""
self.hour = hour
self.min = minute
self.sec = second
def run(self):
"""走字"""
self.sec += 1
if self.sec == 60:
self.sec = 0
self.min += 1
if self.min == 60:
self.min = 0
self.hour += 1
if self.hour == 24:
self.hour = 0
def show(self):
"""显示时间"""
return f'{self.hour:0>2d}:{self.min:0>2d}:{self.sec:0>2d}'
# 创建时钟对象
clock = Clock(23, 59, 58)
while True:
# 给时钟对象发消息读取时间
print(clock.show())
# 休眠1秒钟
time.sleep(1)
# 给时钟对象发消息使其走字
clock.run()
2.定义一个类描述平面上的点,要求提供计算到另一个点距离的方法。
class Point(object):
"""屏面上的点"""
def __init__(self, x=0, y=0):
"""初始化方法
:param x: 横坐标
:param y: 纵坐标
"""
self.x, self.y = x, y
def distance_to(self, other):
"""计算与另一个点的距离
:param other: 另一个点
"""
dx = self.x - other.x
dy = self.y - other.y
return (dx * dx + dy * dy) ** 0.5
def __str__(self):
return f'({self.x}, {self.y})'
p1 = Point(3, 5)
p2 = Point(6, 9)
print(p1, p2)
print(p1.distance_to(p2))
- 点赞
- 收藏
- 关注作者
评论(0)