Day13-面向对象&魔法方法

在这里插入图片描述

面向对象

  • 概念 - 面向对象是一种将同一类解决问题的方法进行以类为单位的封装,通过类创建对象并用对象之间的交互来解决问题的一种思维
面向对象编程( 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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值