您好,希望有人可以帮助我,我对此很陌生,所以不确定我是否遗漏了一些明显的东西。我有一个 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}")
解释:
-
在
__init__
中初始化prices
: -
我们在
__init__
方法中而不是直接在类级别初始化prices
字典。这确保每个类(Food
、Burger
、Desserts
)都有自己的prices
字典。 -
使用
hasattr
检查现有字典: -
在将项目添加到
prices
字典之前,我们使用hasattr(self.__class__, 'prices')
检查当前类是否已经有prices
字典。这可以防止在创建类的其他实例时覆盖字典。 -
使用
setattr
设置字典: -
如果
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