我们洗衣服时,并不会研究洗衣机内部的工作原理。

面向对象就是将编程当成是一个事物,对外界来说,事物是直接使用的,不用去管他内部的情况。而编程就是设置事物能够做什么事。

类和对象的关系

面向对象编程的2个重要组成部分:类和对象

我们先设计图纸,再制造一台洗衣机。类就是图纸,对象就是洗衣机。

类和对象的关系:用去创建(实例化)一个对象

  • 是用来创建对象的抽象概念。
  • 对象是类创建出来的真实事物。
  • 先有类,再有对象。
  • 1个类,可以创建 N 个对象。

定义类

类名要满足标识符命名规则,同时遵循大驼峰命名习惯。

# 定义一个类 
class Washer():
    def wash(self):
        print('我会洗衣服')

创建对象

对象又名实例,创建对象的过程也叫实例化对象。

# 实例化一个对象,也就是创建对象
x = Washer()

# x对象调用实例方法
x.wash()

self

self 指的是调用该函数的对象。打印对象和self得到的结果是一致的,都是当前对象的内存中存储地址。

打印对象和打印 self 得到同一个内存地址,所以self指的是调用该函数的对象(图中实例化一个对象后赋值给“洗衣机”,“洗衣机”就是调用函数的对象)。

1个类,可以创建 N 个对象。
1个类创建多个对象后,self地址不同。

添加、获取对象属性

类外面添加对象属性

语法: 对象名.属性 = 值

类外面获取对象属性

语法: 对象名.属性

类里面获取对象属性

语法: self.属性名

魔法方法 __init__

面向对象中,__xx__() 这样的写法叫魔法方法,一般是具有特殊功能的函数。

__init__

  • init 方法的作用:初始化对象。
  • 在创建一个对象时 init 被默认调用,不用手动调用。
  • init 中的 self 参数,不需要开发者传递,自动把当前的对象引用传递过去。

带参数的 __init__

一个类可以创建多个对象,可以使用参数对不同对象设置不同初始化属性。

__str__

当使用 print 输出对象的时候,默认打印对象的内存地址。如果类定义了 str 方法,那么就会打印从在这个方法中 return 的数据。

__del__

对象删除后,默认调用 __del__ 方法。

应用:烤地瓜

# 定义一个类  
class 地瓜类:  
    def __init__(self):  
        self.被烤时间 = 0  
        self.生熟状态 = '生的'  
        self.调料列表 = []  
  
    def 烤地瓜(self, time):  
        # 烤地瓜的方法  
        self.被烤时间 += time  
        if 0 <= self.被烤时间 < 3:  
            self.生熟状态 = '生的'  
        elif 3 < self.被烤时间 < 5:  
            self.生熟状态 = '半生不熟'  
        elif 5 < self.被烤时间 < 8:  
            self.生熟状态 = '刚刚好熟了'  
        elif self.被烤时间 >= 8:  
            self.生熟状态 = '烤糊了'  
  
    def __str__(self):  
        return f'地瓜烤了{self.被烤时间}分钟,{self.生熟状态}'  
  
  
d1 = 地瓜类()  
print(d1)  # 地瓜烤了0分钟,生的  
d1.烤地瓜(2)  
print(d1)  # 地瓜烤了2分钟,生的  
d1.烤地瓜(2)  
print(d1)  # 地瓜烤了4分钟,半生不熟  
d1.烤地瓜(3)  
print(d1)  # 地瓜烤了7分钟,刚刚好熟了  
d1.烤地瓜(2)  
print(d1)  # 地瓜烤了9分钟,烤糊了
# 定义一个类  
class 地瓜类:  
    def __init__(self):  
        self.被烤时间 = 0  
        self.生熟状态 = '生的'  
        self.调料列表 = []  
  
    def 烤地瓜(self, time):  
        # 烤地瓜的方法  
        self.被烤时间 += time  
        if 0 <= self.被烤时间 < 3:  
            self.生熟状态 = '生的'  
        elif 3 < self.被烤时间 < 5:  
            self.生熟状态 = '半生不熟'  
        elif 5 < self.被烤时间 < 8:  
            self.生熟状态 = '刚刚好熟了'  
        elif self.被烤时间 >= 8:  
            self.生熟状态 = '烤糊了'  
  
    def 添加调料(self, 调料名):  
        # 将调料添加表调料列表  
        self.调料列表.append(调料名)  
  
    def __str__(self):  
        return f'地瓜烤了{self.被烤时间}分钟,{self.生熟状态},添加了调料{self.调料列表}'  
  
  
d1 = 地瓜类()  
print(d1)  # 地瓜烤了0分钟,生的,添加了调料[]
  
d1.烤地瓜(2)  
print(d1)  # 地瓜烤了2分钟,生的,添加了调料[]  
d1.烤地瓜(2)  
print(d1)  # 地瓜烤了4分钟,半生不熟,添加了调料[]  
  
d1.添加调料('盐')  
print(d1)   # 地瓜烤了4分钟,半生不熟,添加了调料['盐']
d1.添加调料('油')  
print(d1)  # 地瓜烤了4分钟,半生不熟,添加了调料['盐', '油']