首页 > 编程问答 >如何在类变量中记录每个实例的属性,同时让父类在同一个变量中记录所有类的实例?

如何在类变量中记录每个实例的属性,同时让父类在同一个变量中记录所有类的实例?

时间:2024-08-01 05:00:30浏览次数:5  
标签:python class object oop

您好,希望有人可以帮助我,我对此很陌生,所以不确定我是否遗漏了一些明显的东西。我有一个 Food 类,然后是每个食物类别的子类。

我希望有一个字典作为每个类中的变量,它记录该类的每个实例的属性。 \目前我正在尝试获取实例名称和价格。因此,最好子类中的每个字典都保存该类实例的名称和价格,而我希望父类中的相同字典保存每个子类中实例的名称和价格。

这可能吗?我按照我理解继承工作的方式假设是这样,但是通过我迄今为止所做的尝试,我只能得到它,以便每个类(包括子类和父类)都包含每个实例名称和价格

这我不明白,因为我看不到 Burger 类字典如何访问 Desserts 类字典中的实例?

真的希望有人可以提供帮助,因为我不知道如何如果在课堂上可行的话,解决这个问题。

class Food:

    prices = {}

    def __init__(self, product, price):
        self.product = product
        self.price = price
        self.prices[self.product] = [self.price]
    
class Burger(Food):
   pass

class Desserts(Food):
    pass

#--->burger menu
burger_option_1 = Burger("burger option 1", 15)
burger_option_2 = Burger("burger option 2", 20)
burger_option_3 = Burger("burger option 3", 25)

#--->dessert menu
dessert_option_1 = Desserts("dessert option 1", 15)
dessert_option_2 = Desserts("dessert option 2", 20)
dessert_option_3 = Desserts("dessert option 3", 25)

print(f"Food.prices: {Food.prices}")
print(f"Burger.prices: {Burger.prices}")
print(f"Desserts.prices: {Desserts.prices}")

output:
Food.prices: {'burger option 1': [15], 'burger option 2': [20], 
'burger option 3': [25], 'dessert option 1': [15], 'dessert option 
2': [20], 'dessert option 3': [25]}
Burger.prices: {'burger option 1': [15], 'burger option 2': [20], 
'burger option 3': [25], 'dessert option 1': [15], 'dessert option 
2': [20], 'dessert option 3': [25]}
Desserts.prices: {'burger option 1': [15], 'burger option 2': 
[20], 'burger option 3': [25], 'dessert option 1': [15], 'dessert 
option 2': [20], 'dessert option 3': [25]}

你发现你的 Food Burger Desserts 类都在使用相同的字典,是因为你在 Python 类中定义和使用类变量的方式造成的。在 Python 中,类变量是共享的,因此所有子类实例都将引用并修改相同的变量。

以下是如何实现你想要的行为:

class Food:
    def __init__(self, product, price):
        self.product = product
        self.price = price

        # 在实例级别动态获取类名
        class_name = self.__class__.__name__

        # 获取价格字典,如果不存在则创建
        if not hasattr(self.__class__, 'prices'):
            setattr(self.__class__, 'prices', {})
        self.__class__.prices[class_name][self.product] = [self.price]

class Burger(Food):
    prices = {}  # 为 Burger 类初始化 prices 字典
    pass

class Desserts(Food):
    prices = {}  # 为 Desserts 类初始化 prices 字典
    pass

#--->汉堡菜单
burger_option_1 = Burger("汉堡选项 1", 15)
burger_option_2 = Burger("汉堡选项 2", 20)
burger_option_3 = Burger("汉堡选项 3", 25)

#--->甜点菜单
dessert_option_1 = Desserts("甜点选项 1", 15)
dessert_option_2 = Desserts("甜点选项 2", 20)
dessert_option_3 = Desserts("甜点选项 3", 25)

print(f"Food.prices: {Food.prices}")
print(f"Burger.prices: {Burger.prices}")
print(f"Desserts.prices: {Desserts.prices}")

解释:

  1. __init__ 中初始化 prices
  2. 我们在 __init__ 方法中而不是直接在类级别初始化 prices 字典。这确保每个类( Food Burger Desserts )都有自己的 prices 字典。

  3. 使用 hasattr 检查现有字典:

  4. 在将项目添加到 prices 字典之前,我们使用 hasattr(self.__class__, 'prices') 检查当前类是否已经有 prices 字典。这可以防止在创建类的其他实例时覆盖字典。

  5. 使用 setattr 设置字典:

  6. 如果 prices 字典不存在,我们使用 setattr(self.__class__, 'prices', {}) 为当前类创建一个空字典。

通过这些更改,每个类都将维护自己的产品和价格列表,而 Food 类将保持为空,因为它不打算直接实例化。

现在输出将是:

Food.prices: {}
Burger.prices: {'Burger': {'汉堡选项 1': [15], '汉堡选项 2': [20], '汉堡选项 3': [25]}}
Desserts.prices: {'Desserts': {'甜点选项 1': [15], '甜点选项 2': [20], '甜点选项 3': [25]}}

这个输出显示每个类现在如何保存其实例的单独价格字典,这正是你想要的行为。

标签:python,class,object,oop
From: 78818242

相关文章

  • Python 将脚本转换为 exe 并给出 PermissionError
    我有一个Python(Windows10)脚本,其功能之一是创建备份。这是函数:defcreate_backups(self,file:str,counter:int=None)->None:counter=counteror1res=self.re_obj.match(file)ifresisNoneorlen(res.groups())==0:back_file=......
  • conda update python 不会更新,但 conda update --all 会更新
    我正在尝试更新我的venv。这就是我看到的(base_test)>condaupdatepythonCollectingpackagemetadata(current_repodata.json):doneSolvingenvironment:done==>WARNING:Anewerversionofcondaexists.<==currentversion:4.10.3latestversion:24......
  • 如何使用 Selenium (python) 访问另一个影子根中影子根中的元素?
    我有以下代码和HTML结构(我不是这方面的专家)。我正在尝试抓取HTML代码末尾的96.00C元素,其路径是:Xpath://*[@id="_grid"]/set-class2/div2/text-binding//text()完整Xpath:/html/body/main/div/div3/div3/......
  • 在Python中,如何在一段时间内接受输入
    我正在尝试用Python制作一个蛇游戏,但不知道如何制作它,以便蛇在没有玩家输入的情况下继续移动,所以如果有人知道一个简单的方法来做到这一点,我需要在2秒后取消输入将不胜感激代码如下:importrandomimportsysplayerY=(1)playerX=(0)appleY=random.randint(1,10)appl......
  • 在Python中单步执行代码时是否可以引发异常
    当我在IDE(例如PyCharm)中单步执行代码时,我想转储函数的参数(以供以后使用,例如复制它)。计划的场景是在某处设置断点,然后引发异常(这不在我运行的代码中,这就是重点),并捕获它。代码应该如下所示:defexception_cathcher_decorator(func):try:returnfunc(*f_args,**f_k......
  • 解决python自动化操作异常处理的问题
    在python自动化领域,往往要用到pyautogui,pywin32等模块实现自动化操作。然而,这种自动化操作,本身具有一定的局限性,其中最主要的一个问题就是,一旦执行结果不按照脚本预设的来执行,往往会抛出异常,导致程序中断。解决这个问题,主要有这么几种思路:第一,每一次操作后分情况讨论。这种方......
  • Python爬虫入门03:用Urllib假装我们是浏览器
    文章目录引言Urllib库简介Request模块详解Error模块与异常处理Parse模块与URL解析Robotparser模块模拟浏览器请求使用Request方法添加请求头信息代码示例1.设置请求URL和请求头2.定义请求参数并转换为适当的格式3.使用Request方法封装请求4.发送请求并获取响应常用......
  • 零件形式的 CLASS 接口式开发
    装载类类中包含仓库接口类装载在装在类中,指针模式获取(指针不慢,new开辟内存慢)把类放堆上初始化时候new实时计算类网络通信接收发送数据时主线程等待会等网走完的,画图是实时的,网是放在新线程里面双核处理器会两个核心交替处理任务管理器中显示的每一个线程那个句柄是进程......
  • 请以零基础学Python 之 第二十讲 分组和贪婪匹配
    当我们处理字符串时,有时候需要根据特定的模式来分割或者提取信息。Python提供了强大的正则表达式库re,可以帮助我们实现这些复杂的字符串操作。本篇博客将介绍两个常用的正则表达式技巧:分组和贪婪匹配。分组(Grouping)在正则表达式中,分组是将多个模式单元组合为一个单元,以便......
  • 零基础学python 之 第十九讲 正则表达式
    当你开始学习Python编程时,正则表达式是一项非常强大的工具,用于处理文本数据中的模式匹配和搜索。本篇博客将带你从零开始学习如何在Python中使用正则表达式。1.什么是正则表达式?正则表达式(RegularExpression)是用于描述字符串模式的一种工具,可以用来匹配、查找、替换符合特......