Python基础学习009——类的封装

python 复制代码
# 面向对象是一种编程思想,还有另一种是面向过程
# 面向过程,具体步骤的实现,所有功能都自己书写
# 面向对象,使用一个个工具(函数),帮助完成各项任务
# 类:对多个特性相同或相似的食物的统称,根据特征不同一个事物可以属于多个类
# 对象:由类实例化的一个事物,指代1个
# 类的组成:类名(大驼峰),属性即类的特征,方法即类要做什么事
# 类的抽象:找到类名,属性和方法
"""
1.定义类:定义前先设计类
2.创建对象:使用第一步定义的类创建对象
3.通过对象调用方法
"""


# 定义类
class Person:
    def run(self):  # 方法的本质是在类中定义的函数,只不过要带一个self参数
        print("跑起来")
        print(id(self))


# 创建对象Person()形式即可创建对象,只不过这样不能使用,需要一个变量把对象保存起来
# 变量 = 类名()形式,变量中保存的是对象的引用,可以说变量a就是对象A
# 一个类可以创建多个对象,每个对象的地址都不一样
xiaoming = Person()
# 调用对象
xiaoming.run()

# self:从函数的语法上说,self是形参,可以是任意变量名,只不过习惯将它写作self
# self是普通形参,但调用的时候可以不传递实参值,不符合函数语法.
# 实际是Python解释器在调用这个方法的时候自动将调用这个方法的对象,即xiaoming,传递给self
# 所以self本质是一个对象.验证:self的引用和调用小明的引用一致
print(id(xiaoming))  # 此处结果与上一行调用时run方法结果一致


# ------------------------------------------------------------
# 添加属性 对象.属性名 = 属性值
# 1.类内部添加:self.属性名 = 属性值,一般添加在_init_方法中
# 2.类外物添加:对象.属性名 = 属性值,一般不用

# 获取属性:对象.属性名
# 1.类内部获取:self.属性名
# 2.类外部获取:对象.属性名,一般不使用


class Cat:
    def eat(self):
        print(f'小猫{self.name}吃鱼')


black_cat = Cat()
black_cat.name = '黑黑'  # 在外部添加属性
black_cat.eat()


# --------------------------------------------------
# 魔法方法:以两个下划线开头,两个下划线结尾,在满足某个条件的情况下会自动调用


class Dog:
    def __init__(self, n, a):
        self.name = n
        self.age = a

    def __str__(self):
        return f'今年{self.age}岁了'

    def show(self):
        print(f'小狗{self.name}')


# 魔法方法在什么情况下自动调用
# 创建对象后自动调用
white_dog = Dog('巴顿', 2)  # 在这一步就已经调用了__init__
# 用在哪:给对象添加属性(初始化方法,构造方法).某行代码在每次创建对象后都要执行,就可以写在__init__中
# 注意事项:不要漏_,不要拼错名称init,如果init方法出了self之外的形参,必须传参
white = white_dog  # 没有创建对象,只是给对象一个别名,只有类名()形式才是创建对象
white.show()  # 别名与原名同样使用

# ---------------------------------------------
# __str__方法:
# 什么情况下自动调用:使用print打印对象时,这个方法中一般书写对象的属性信息,
# 用在哪:即想要在对象打印时输出什么内容,就把对应内容写进这个函数默认输出对象的引用地址
# 注意事项:必须返回一个字符串
print(white_dog)


# -------------------------------------------
# __del__:对象被销毁是自动调用(处理后事)
# 使用del删除对象,或者代码全部运行结束,声明周期到,销毁对象
# 如果对象有多个名字,即多个对象引用一个对象,需要把所有跟这个对象有关的名称都删除才行
class demo:
    def __init__(self, n):
        self.name = n
        print('调用了init')

    def __del__(self):
        print(f"调用del,{self.name}要删除")


a = demo('zhangsan')
b = demo('liso')
c = demo('adfs')
cc = c
del cc  # cc只是对象c的其中一个名称,只删除cc是不会调用__del__的,
print("此语句执行在删除adfs前")
del c  # 与对象c有关的名称全部被删除,则调用__del__销毁
print('此语句执行在删除adfs后')
del a  # 特意声明删除对象a,此时调用__del__销毁对象a
print("zhangsan销毁后")
print("代码结束,此句后销毁剩余未销毁的对象,即对象b")


# ---------------------------------------------------------------------------------
class House:
    def __init__(self, House_type, House_area):
        self.House_type = House_type  # 房型
        self.House_area = House_area  # 总面积
        self.Last_area = House_area  # 剩余面积
        self.item_list = []  # 家具列表

    def __str__(self):
        return f'户型:{self.House_type}\n总面积:{self.House_area}\n剩余面积:{self.Last_area}\n家具:{self.item_list}'

    def add_item1(self, *args):
        for i in args:
            if self.Last_area > i.get('area'):
                self.item_list.append({'name': i.get('name'), 'area': i.get("area")})
                self.Last_area -= i.get('area')
        else:
            print('剩余面积不足')

    def add_item2(self, item):
        if self.Last_area > item.area:
            self.item_list.append({'name': item.name, 'area': item.area})
            self.Last_area -= item.area
        else:
            print('剩余面积不足')


class Furniture:
    def __init__(self, name, area):
        self.name = name
        self.area = area

    def __str__(self):
        return f'家具:{self.name},占地面积:{self.area}'


house1 = House('三室一厅', 100)
house1.add_item1({'name': '衣柜', 'area': 2}, {'name': '餐桌', 'area': 1.5})
print(house1)
bed = Furniture('席梦思', 4)
chest = Furniture('衣柜', 2)
table = Furniture('餐桌', 1.5)
house1.add_item2(bed)
print(house1)
相关推荐
数据智能老司机14 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机14 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机14 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i14 小时前
drf初步梳理
python·django
每日AI新事件14 小时前
python的异步函数
python
这里有鱼汤15 小时前
miniQMT下载历史行情数据太慢怎么办?一招提速10倍!
前端·python
databook1 天前
Manim实现脉冲闪烁特效
后端·python·动效
程序设计实验室1 天前
2025年了,在 Django 之外,Python Web 框架还能怎么选?
python
倔强青铜三1 天前
苦练Python第46天:文件写入与上下文管理器
人工智能·python·面试
用户2519162427111 天前
Python之语言特点
python