Python面向对象

博主昵称:摆烂阳

博主主页跳转链接
‍博主研究方向:渗透测试 、python编程
博主寄语:希望本篇文章能给大家带来帮助,有不足的地方,希望友友们给予指导

本篇目标

  • 理解面向对象
  • 类和对象
  • 添加和获取对象熟悉
  • 魔法方法

一、理解面向对象

面向对象就是将编程当成一种事物,对于外界,事物是可以直接使用的,不用管内部的具体实现步骤,而我们编程就是设置这个事物可以做什么。

打个比方,若在某游戏中设计一个乌龟的角色,应该如何来实现呢?使用面向对象的思想会更简单,可以分为如下两个方面进行描述:

1、从表面特征来描述,例如,绿色的、有 4 条腿、重 10 kg、有外壳等等。
2、从所具有的的行为来描述,例如,它会爬、会吃东西、会睡觉、会将头和四肢缩到壳里,等等。

如果将乌龟用代码来表示,则其表面特征可以用变量来表示,其行为特征可以通过建立各种函数来表示。参考代码如下所示:

class tortoise:
    bodyColor = "绿色"
    footNum = 4
    weight = 10
    hasShell = True
    #会爬
    def crawl(self):
        print("乌龟会爬")
    #会吃东西
    def eat(self):
        print("乌龟吃东西")
    #会睡觉
    def sleep(self):
        print("乌龟在睡觉")
    #会缩到壳里
    def protect(self):
        print("乌龟缩进了壳里")

二、类和对象

类:可以理解是一个模板,通过它可以创建出无数个具体实例。比如,前面编写的 tortoise 表示的只是乌龟这个物种,通过它可以创建出无数个实例来代表各种不同特征的乌龟(这一过程又称为类的实例化)。

对象:类并不能直接使用,通过类创建出的实例(又称对象)才能使用。这有点像汽车图纸和汽车的关系,图纸本身(类)并不能为人们使用,通过图纸创建出的一辆辆车(对象)才能使用。

属性:类中的所有变量称为属性。例如,tortoise 这个类中,bodyColor、footNum、weight、hasShell 都是这个类拥有的属性。

方法:类中的所有函数通常称为方法。不过,和函数所有不同的是,类方法至少要包含一个 self 参数(后续会做详细介绍)。例如,tortoise 类中,crawl()、eat()、sleep()、protect() 都是这个类所拥有的方法,类方法无法单独使用,只能和类的对象一起使用。

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

类和对象的关系:类产生对象 ----》 实例化

1、理解类和对象

1.1 类

数据: 就是变量 ======》 类中叫属性

功能: 就是函数 ======》 类中叫方法

类就是一系列具有相同特征行为的事物的统称,是一个抽象化概念,不是真实存在的事物。

  • 特征即是属性
  • 行为即是方法

1.2 对象

对象就类创建出来的真实存在的事物

注意:开发中,先有类,再有对象

类是抽象的,对象是具体的

一个类可以有多个对象

类是一系列对象的集合

类和类之间行为不同,对象与对象之间数据不同。

2、面向对象实现方法

2.1 定义类

  • 语法
# 定义函数
def 函数名():
	函数体
	
	
# 定义类
class 类名():
	代码
	

注意:类名要满足标识符规则,同时遵循大驼峰命名规则

class Washer():
    def wash(self):  # 实例方法
        print('洗衣服===')

2.2 创建对象

  • 语法:
    • 对象名=类名() # 类的实例化
# 洗衣机   洗衣服
class Washer():
    def wash(self):  # 实例方法
        print('洗衣服===')


# 创建对象
# xiaotiane = Washer()
# print(xiaotiane)

# 验证功能    在类中叫实例方法/对象方法     -----  对象名.实例方法名()
# xiaotiane.wash()

2.3 self

self指的就是调用该实例方法的对象

# 洗衣机   洗衣服
class Washer():
    def wash(self):  # 实例方法
        print(self)  # self指的是调用该方法的实例对象
        print('洗衣服===')


xiaotaine = Washer()
print(xiaotaine)
xiaotaine.wash()


xiaotaine1 = Washer()
print(xiaotaine1)
xiaotaine1.wash()

三、添加和获取对象属性

对象属性可以在类里面添加,也可以在类外面添加。

1、类外面添加对象属性

  • 语法:
对象名.属性名 =class Washer():
    def wash(self):
        print('洗衣服')


xiaotiane = Washer()
xiaotiane.wash()
# 添加属性
xiaotiane.height = 1000  # 高
xiaotiane.width = 500  # 宽

# 获取属性
print(xiaotiane.width)
print(xiaotiane.height)

2、类里面获取属性

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

    def print_info(self):
        """获取属性"""
        print('洗衣机的高度是:', self.height)


xiaotiane2 = Washer()
# xiaotiane.wash()
# xiaotiane2.print_info()
# 添加属性
xiaotiane2.height = 1000  # 高
xiaotiane2.width = 500  # 宽
xiaotiane2.print_info()

四、魔法方法

在Python中,__xx__()的方法就叫魔法方法,指的是具有特殊功能的方法。

1、 __init__()方法

class Washer():
    def __init__(self):  # 初始化魔法方法
        # 添加属性
        print('这是初始化魔法方法')
        self.height = 1000
        self.width = 300

    def print_info(self, name):
        """获取属性"""
        print('洗衣机的高度是:', self.height)
        print(name)


xiaotiane = Washer()
xiaotiane.print_info('nihao')


xiaotiane1 = Washer()
xiaotiane1.print_info('dajiahao')

注意:__init__()方法,在创建对象的时候就会被默认调用,不需要手动调用,self参数不需要传递的,Python解释器会自动吧当前对象的引用传递过去。

注意:init魔法方法 注意不要写成int魔法方法,不要多下划线和少下划线

1.1 带参数的init魔法方法

需求:一个类中有多个对象,如何对多个对象设置不同的属性值

传参

class Washer():
    def __init__(self, height, width):  # 初始化魔法方法
        # 添加属性
        self.height = height
        self.width = width

    def print_info(self):
        """获取属性"""
        print('洗衣机的高度是:', self.height)
        print('洗衣机的高度是:', self.width)


xiaotiane = Washer(1000, 300)
xiaotiane.print_info()

2、str魔法方法

当print输出一个对象的时候,默认打印的是对象的内存空间地址,如果在类中定义了str魔法方法之后,那么此时在打印对象的时候就是打印的这个方法的返回值。

class Washer():
    def wash(self):
        print('洗衣服===')

    def __str__(self):  # 类的说明或者类的状态
        return '这是洗衣机的使用说明'


xiaotiane = Washer()
print(xiaotiane)

3、del魔法方法

当删除一个对象的时候,Python解释器会自动调用del魔法方法

class Washer():
    def wash(self):
        print('洗衣服===')

    def __del__(self):
        """删除对象"""
        print(f'{self}对象已经被删除')


xiaotiane = Washer()
# del xiaotiane
print(xiaotiane)


class Washer():
    def __init__(self, height, width):  # 初始化魔法方法
        # 添加属性
        self.height = height
        self.width = width

    def print_info(self):
        """获取属性"""
        print('洗衣机的高度是:', self.height)
        print('洗衣机的高度是:', self.width)


xiaotiane = Washer(1000, 500)
# print(id(xiaotiane.height))
print(id(xiaotiane.print_info()))

xiaotiane2 = Washer(2000, 300)
# print(id(xiaotiane2.height))
print(id(xiaotiane2.print_info()))

注意:

  • 如果一个类有多个对象,每个对象的属性是各自独立保存的,都是独立的地址。
  • 但是实例方法是所有对象所共享的,只占用一份内存空间,类会通过self参数来判断是那个对象调用了该实例方法。

五、综合案例

烤牛肉串儿

1、需求

被烤的时间和牛肉串儿的状态

【 0-2:生的
2-5: 5分数
5-8: 全熟
8分钟以上:糊了】

添加作料

【可以根据用户喜好添加作料】

2、步骤分析

涉及到一个事物:牛肉 抽象出来一个类

3、 实现代码

定义类

  • 牛肉的属性
    • 牛肉的状态
    • 被烤的时间
    • 添加的作料
  • 牛肉的方法
    • 被烤
      • 用户要指定烤的时间
      • 查看牛肉的状态,并且随着时间改变牛肉的状态
    • 添加作料
      • 用户想添加什么就添加什么
      • 保存用户添加的作料
  • 显示牛肉的状态
class Beef():
    def __init__(self):
        # 被烤的时间
        self.cook_time = 0
        # 状态
        self.cook_state = '生的'
        # 添加的作料
        self.condiments = []

    def cook(self, time):
        """烤牛肉"""
        self.cook_time += time
        if 0 < self.cook_time <= 2:
            self.cook_state = '生的'
        elif 2 < self.cook_time <= 5:
            self.cook_state = '5分熟'
        elif 5 < self.cook_time <= 8:
            self.cook_state = '全熟'
        elif self.cook_time > 8:
            self.cook_state = '糊了'

    def add_condiments(self, condiment):
        """添加作料"""
        self.condiments.append(condiment)

    def __str__(self):
        return f"这个牛肉串被烤的总时间是{self.cook_time}, 状态是{self.cook_state}, 添加的作料有{self.condiments}"


niurou = Beef()
print(niurou)
niurou.cook(1)
print(niurou)
niurou.cook(2)
print(niurou)
niurou.add_condiments('孜然')
niurou.add_condiments('胡椒粉')
print(niurou)

你可能感兴趣的:(python,python,开发语言)