Day13
面向对象编程
一、面向对象
面向对象是一种思维,使用这种思维设计的程序能够将数据和对数据进行的封装操作装在一起组成一个类;可以通过类创建对象,通过对象之间的交互来解决问题
二、面向对象编程(OOP)
Object Oriented Programming:利用面向对象中类和对象的思维进行问题解决
三、面向过程和面向对象对比
- 面向过程:遇到问题,直接自己写代码实现解决问题的程序
- 面向对象:遇到问题,想有没有已经存在的解决这个问题的程序
四、举例
普通家庭(面向过程):
找个盆子接水,放入脏衣服,放洗衣液,手搓,晾晒
小康家庭(函数):
造个洗衣机,接水,放入洗衣机,洗衣机自动清洗,烘干,晾晒
富豪(面向对象):
请一堆保姆,买一台洗衣机,让保姆每天在固定的时间、地点取脏衣服放入洗衣清洗,保姆对衣服进行晾晒,收取,放回指定的位置
类和对象
一、类
- 人以类聚,物以群分
- 类具有相同的属性和方法
- 类是抽象的
- 一个类可以有多个对象
二、对象
对象是真实存在的能够看到和摸到的具体的事物
三、类和对象的使用
- 定义类
- 通过类实例化对象
- 对象调用对象方法(这个实例化出来的个体去做他能做的事)
class Student:
# 在学生类中给学生构造方法(对象方法)
def study(self):
return '学生在学习'
def play(self,game):
return f'学生在玩{game}'
s1 = Student()
print(s1)
# a.对象.对象方法(参数)
print(s1.study())
# b.类.对象方法(对象,参数)
print(s1.play('原神'))
print(Student.play(s1,'原神'))
self:行业内约定成俗的一个名字,谁调用方法,self就指向谁
对象属性和类属性
- 定义类属性
- 初始化方法(设置对象属性)
- 在类中给学生构造方法(对象方法)
- 给某个对象赋予属性(对象属性)
- 调用类属性
- 调用对象属性
class Student:
# 定义类属性
schoolUnifrom = '校服'
# 初始化方法(设置对象属性)
def __init__(self,name,sex,age):
self.name = name
self.sex = sex
self.age = age
# 在学生类中给学生构造方法(对象方法)
def study(self):
return f'{self.age}岁的穿着{Student.schoolUnifrom}的{self.name}在学习'
def play(self,game):
return f'{self.name}在玩{game}'
# 给某个对象赋予属性(对象属性)
s1 = Student('张三','男',18)
print(s1)
print(s1.play('原神'))
print(s1.study())
# 对象属性:是某个个体自己独有的属性
# 类属性:整体的这一类共同拥有的特点、属性
# 调用类属性
# 1.类名.类属性
print(Student.schoolUnifrom)
print(s1.schoolUnifrom)
# 调用对象属性:
# 对象.对象属性
print(s1.name)
self说明
self:行业内约定成俗的一个名字,谁调用方法,self就指向谁
self指代被实例化出来的对象,self相当于一个类中各部分传参的介质
class Student:
# 定义类属性
schoolUnifrom = '校服'
# 初始化方法(设置对象属性)
def __init__(self, name, sex, age):
self.name = name
self.sex = sex
self.age = age
print(id(self), '+')
# 在学生类中给学生构造方法(对象方法)
def study(self):
print(id(self), '=')
return f'{self.age}岁的穿着{Student.schoolUnifrom}的{self.name}在学习'
def play(self, game):
return f'{self.name}在玩{game}'
s1 = Student('张三', '男', '18')
# id:查看某个数据类型在内存中的地址
print(id(s1), '*')
s1.study()
练习
定义一个圆类,实现两个圆之间圆心距离的计算,通过半径和圆心距离在判断
求圆的周长和面积
判断两个圆是否相切(内切、外切)、相交、相离
class Cricle:
pi = 3.14
def __init__(self, r, point):
self.r = r
self.point = point
def area(self):
return Cricle.pi * self.r ** 2
def perimeter(self):
return Cricle.pi * 2 * self.r
C1 = Cricle(4, (0, 0))
print(f'圆C1的面积为{C1.area()}')
print(f'圆C1的周长为{C1.perimeter()}')
C2 = Cricle(3, (3, 4))
def length(Cricle1, Cricle2):
return ((Cricle1.point[0] - Cricle2.point[0]) ** 2 +
(Cricle1.point[1] - Cricle2.point[1]) ** 2) ** 0.5
weight = length(C1, C2)
print(f'两个圆的圆心距离为{weight}')
if C1.r + C2.r == weight:
print('两个圆外切')
elif C1.r + C2.r > weight:
print('两个圆相交')
elif abs(C1.r - C2.r) == weight:
print('两个圆内切')
elif C2.r < weight < C1.r or C1.r < weight < C2.r:
print('两个圆内含')
else:
print('两个圆相离')
对象方法、类方法、静态方法
一、区分
对象方法:在类中定义的对象能够做的事情的方法,叫做对象方法,方法中第一个参数为self,指向对象
类方法:在类中给类定义的方法,需要写语法糖@classmethod,类方法中第一个参数是cls,指向类
静态方法:在类中定义的普通方法,需要写语法糖@staticmethod,既不指向类,也不指向对象,仅仅是依附于类
二、如何调用
- 对象方法只能是对象调用
- 类方法既可以直接使用类进行调用,也可以使用对象调用
- 静态方法既可以直接使用类进行调用,也可以使用对象调用
class Triangle:
def __init__(self, a, b, c):
self.a = a
self.b = b
self.c = c
@classmethod
def isTriangle(cls, a, b, c):
if a + b > c and a + c > b and b + c > a:
return True
else:
return False
@staticmethod
def isTriangle_1(a, b, c):
if a + b > c and a + c > b and b + c > a:
return True
else:
return False
def permeter(self):
return self.a + self.b + self.c
def area(self):
"""海伦公式(秦九韶公式)"""
p = (self.a + self.b + self.c) / 2
return (p * (p - self.a) * (p - self.b) * (p - self.c)) ** 0.5
a,b,c = 3,4,5
if Triangle.isTriangle(a,b,c):
t1 = Triangle(a,b,c)
else:
print('这三条边不能构成三角形')
魔法方法(魔术方法)
一、定义
魔法方法是python定义的一系列由双下划线 + 方法名组成的特殊方法
魔法方法不需要调用,会在合适的阶段自动被触发;如果手动调用魔法方法,可以对魔法方法的功能进行修改
二、常见的魔法方法
- init:初始化对象属性
- del:python内存回收机制(ARC),python可以自动的在一个对象被销毁后回收内存
- str:将其他数据类型转字符串:a.%s、str()等被调用时会自动触发本方法
- repr:是__str__的备胎
- add:加法
- sub:减法
- truediv:真除法()
- floordiv:除法
- mod:取余
class Student:
def __init__(self,name,age):
self.name = name
self.age = age
def __repr__(self):
return f'这是{self.age}岁的{self.name}'
s1 = Student('AH',21)
print(s1)