PYTHON进阶-面向对象编程

Python
93
0
0
2024-04-12
标签   Python进阶

面向对象的介绍🫧

面向对象编程(Object-Oriented Programming,简称OOP)是一种程序设计思想,它将数据和处理数据的方法组合成一个类(Class),并通过实例化(Instantiation)这个类来创建对象(Object)。这些对象可以互相协作,通过消息传递(Message Passing)来完成程序的功能。

这样做的好处是,它使程序更加模块化、易于维护和扩展,提高了代码的复用性和可读性。

通俗地讲,面向对象就是将编程当成是一个事务,对外界来说,事务是直接使用的,不用去管它内部的情况.而编程就是设置事物能够做什么事.就像是洗衣机洗衣服一样,我们不需要知道它怎么洗的我们只需要用它做我们想做的事情例如洗衣服,烘干,脱水这些功能即可.

面向对象过程中,有两个重要组成部分: 类 和 对象.

洗衣机就是我们要使用的对象,它的图纸就是类,我们需要通过 类(图纸) 去创建 对象(洗衣机).

用类创建对象的过程也叫做实例化---->平时我们都叫做 实例化~

1.1定义类 的 语法:

class 类名():
    代码
    ......

类名遵循大驼峰命名习惯.

1.2创建对象(对象又名实例) 的 语法:

先有类名再有对象名

对象名 = 类名()

体验类和对象

#需求 : 洗衣机. 功能: 能洗衣服
# 1. 定义洗衣机类
"""
class 类名():
    代码
"""

class Washer():
    def wash(self):
        print("能洗衣服")

# 2. 创建对象--->先有类名再有对象
# 对象名 = 类名()
haier = Washer()

# 3. 验证成果
# 打印 haier 对象
print(haier)

# 使用 wash功能 -实例方法/对象方法  -- 对象名.Wash()
haier.wash()

self是什么?让我们通过打印它的内存地址来观察一下

#类里的self---指的是调用该函数的对象
#类:洗衣机 功能:洗衣服
class Washer:
    def wash(self):
        print("能洗衣服")
        print(self)

#利用类实例化对象
haier = Washer()
print(haier)#打印haier这个对象的内存地址

haier.wash()
#由于打印对象和打印self得到的内存地址相同.
# 所以self指的是调用该函数的对象---即haier

验证一个类是否可有多个对象,对象调用内存地址时,self地址是否相同
# 实验:1. 一个类可以创建多个对象; 2. 多个对象都调用函数的时候,self地址是否相同`
class Washer():
    def wash(self):
        print("洗衣服")
        print(self)

#创建对象-类名()
haier1 = Washer()
haier1.wash()

# 实验:1. 一个类可以创建多个对象; 2. 多个对象都调用函数的时候,self地址是否相同`
class Washer():
    def wash(self):
        print("洗衣服")
        print(self)

#创建对象1-类名()
haier1 = Washer()
haier1.wash()

#创建对象2-类名()
haier2 = Washer()
haier2.wash()

结论:一个类可以创建多个对象,且每个对象的内存地址截然不同

添加和获取对象属性🔅

1.类外 - 添加和获取对象属性🍬

#添加和获取对象属性
#属性即特征 --- 宽度,高度,质量等
#类 外面添加对象属性    语法: 对象名.属性名  = 值
class Washer():
    def wash(self):
        print("能洗衣服")

#创建对象
haier1 = Washer()

#类外添加对象属性
#给对象添加属性  对象名.属性名 = 值
haier1.width = 500
haier1.height = 800

#获取属性  对象名.属性名
print(f"洗衣机的宽度是{haier1.width}")
print(f"洗衣机的高度是{haier1.height}")

2.类内 - 获取对象属性🍭

#属性即特征 --- 宽度,高度,质量等
#类 添加对象属性    语法: 对象名.属性名  = 值
class Washer():
    def wash(self):
        print("能洗衣服")

    # 定义一个函数获取实例属性
    def print_info(self):
        # 类内获取对象属性 --- self.属性名
        #print(self.width)
        print(f"洗衣机的宽度是{self.width}")
        print(f"洗衣机的高度是{self.height}")

#创建对象
haier1 = Washer()

#给对象添加属性  对象名.属性名 = 值
haier1.width = 500
haier1.height = 800

#对象调用实例方法
haier1.print_info()

魔法方法 __init__🪄

因为洗衣机在没有使用之前它就具有,高度,宽度这些属性,我们可以在生产过程中就赋予这些属性.

(在创建洗衣机对象之前它就有这些属性,所以这些属性是在类里面)

魔法方法__init__是Python类中的一个魔法方法,用于在创建类的实例对象时进行初始化操作。通俗的来讲,就是在一个类中定义了__init__方法,当你创建这个类的实例对象时,Python会自动调用这个方法进行初始化操作,对对象的各个属性进行赋值或者其他操作。 类似于生产一个产品的时候,要对产品进行初始化,比如给它设置一些属性、赋予一些特定的功能等等。

我们可以利用 __init__()方法

__init__()方法的作用: 初始化对象---无需手动调用

#目标: 定义init魔法方法设置初始化属性 并访问调用
"""
1.定义类
    init魔法方法: width 和 height
    添加实例方法: 访问实例属性

2. 创建对象
3. 验证成果
    调用实例方法
"""

class Washer():
    def __init__(self):#__init__()方法的作用 : 初始化对象
        #添加实例属性
        self.width = 500
        self.height = 800

        #实例方法
    def print_info(self):
        #类里面调用实例属性
        print(f"洗衣机的宽度是{self.width}")
        print(f"洗衣机的高度是{self.height}")

#创建对象(实例化)
haier = Washer()

#当对象调用实例方法时才能打印出对应魔法方法里面设定的属性值
haier.print_info()
注意:__init__()方法,在创建一个对象时默认被调用,不需要手动调用__init__(self)中的self参数,不需要开发者传递,python解释器会自动把当前的对象引用(即对象名)传递过去
在类外给对象添加的属性与使用魔法函数添加的属性之间有几个区别:
  1. 范围不同:在类外部添加属性,它们只被添加到特定实例中,在整个类和其他实例中是不可见的。而使用魔法函数,添加的属性是与类相关的,因此它们在整个类和所有实例中都可见。
  2. 方法不同:在类外部添加属性,可以使用点运算符或者直接赋值的方式添加属性。而使用魔法函数,需要按照特定的格式编写函数,才能正确地添加属性。
  3. 继承不同:在类外部添加属性,对子类的影响通常是有限的。而使用魔法函数,可以添加到类的整个继承层次结构中,从而影响所有子类。
  4. 命名不同:在类外部添加属性时,可以使用任何有效的变量名。而使用魔法函数命名属性时,需要按照特定的格式命名,以避免与其他属性冲突。

总之,虽然两种方法都可以添加属性,但它们在范围、方法、继承和命名等方面有所不同,需要根据具体的使用场景进行选择。

带参数的__init__方法🧸

一个类创建多个对象,且每个对象具有不同的属性值

带参数的__init__方法是在定义类时设置的一种方法,它允许我们在创建对象时传入参数,从而初始化对象的属性或执行特定的操作。这样可以使得对象具有更灵活的属性和行为,更好地满足各种需求
# 1. 定义类: 带参数的init: 宽度和高度;
class Washer():
    def __init__(self,width,height):
        self.width = width
        self.height = height

    #实例方法: 调用实例属性
    def print_info(self):
        print(f"洗衣机的宽度是{self.width},高度是{self.height}")

# 2. 创建对象. 创建多个对象属性值不同; 然后调用它的实例方法
haier1 = Washer(10,20)
haier1.print_info()

#对象2:haier2
haier2 = Washer(100,200)
haier2.print_info()

魔法方法__str__🪄

当使用 print 输出对象的时候, 系统会自动默认打印出对象的内存地址.

若果 定义了 __str__ 方法,那么当我们 print(对象) 的时候 就会打印出从这个方法中 return 的数据.

所以魔法方法 __str__ 的作用就是: 返回类的作用或对象的状态


未定义魔法方法__str__,直接打印对象haier

class Washer():
    def __init__(self,width,height):
        self.width = width
        self.height = height

    def print_info(self):
        print(f"这个洗衣机的宽度是{self.width},高度是{self.height}")


haier = Washer(100,200)
haier.print_info()
print(haier)


定义了魔法方法 __str__ 然后return了 "类的说明或对象状态的说明."

class Washer():
    def __init__(self,width,height):
        self.width = width
        self.height = height

    def print_info(self):
        print(f"这个洗衣机的宽度是{self.width},高度是{self.height}")

    def __str__(self):
        return "这个洗衣机出现故障"

haier = Washer(100,200)
haier.print_info()
print(haier)

魔法方法__del__🪄

作用:用于删除对象

class Washer():
    def __init__(self):
        self.width = 300

    def __del__(self):
        print("对象已删除")

haier = Washer()