面向对象
- 概念 - 面向对象是一种将同一类解决问题的方法进行以类为单位的封装,通过类创建对象并用对象之间的交互来解决问题的一种思维
面向对象编程( OOP - Object Oriented Programming )
- 概念 - 利用面向对象的思维解决编程问题
面向过程编程和面向对象编程对比
- 面向过程 - 遇到问题,直接自己写代码解决问题
- 面向对象 - 遇到问题,先判断有没有可调用的已有方法解决问题
类
- 人以类聚,物以群分
- 类具有相同的属性和方法
- 类是抽象的,一个类可以有多个对象
对象
- 对象为真实看得见也摸得着的具体事物
类和对象如何使用
# 1. 使用关键字class,定义一个学生类
class student:
def study(self):
return '学生正在学习'
def play(self, name):
return f'学生在玩{game}'
# 2. 通过类来实例化对象
# 使用构造器语法创建对象,类似于创建列表list()
s1 = Student()
print(s1)
# 3. 对象调用对象方法
# 两种方式
print(s1.study())
print(Student.play(s1, '王者荣耀'))
# self 为行业内约定俗称的名字,self始终指向调用方法的对象
对象属性和类属性
# class Student:
schoolUniform = '校服' # 定义名为schoolUniform的类属性
def __init__(self, name, sex, age): # 初始化方法/设置对象属性
self.name = name
self.sex = sex
self.age = age
def study(self):
return f'{self.age}岁穿着{Student.schoolUniform}的{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.schoolUniform)
# 2. 对象.类属性
print(s1.schoolUniform)
# 调用对象属性
# 对象.对象属性
print(s1.name)
练习
# 定义一个圆类,实现两个圆之间圆心距离的计算,圆的周长和面积
# 通过半径和圆心距离再判断, 是否相切(内切、外切)、相交、举例
class Circle:
pi = 3.14
def __init__(self, r, point): # 圆中心的坐标
self.r = r
self.point = point
def area(self):
return Circle.pi * self.r * 2
def perimeter(self):
return Circle.pi * 2 * self.r
C1 = Circle(4, (0, 0))
print(f'圆C1的面积为{C1.area()}')
print(f'圆C1的周长为{C1.perimeter()}')
C2 = Circle(3, (3, 4))
def length(Circle1, Circle2):
return ((Circle1.point[0] - Circle2.point[0]) ** 2 + (Circle1.point[1] - Circle2.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 C1.r < weight < C2.r or C2.r < weight < C1.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 peremeter(self):
return self.a + self.b + self.c
def area(self):
""" 海伦公式 / 秦九韶公式 """
p = self.a + self.b + self.c
(p / 2 * (p / 2 - self.a) * (p / 2 - self.b) * (p / 2 * self.c)) ** 0.5
a, b, c = 3, 4, 10
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.name}, {self.age}岁'
s1 = Student('张三', 18)
print(s1)