ANTIFRAGILE. 2022-02-28 19:08 采纳率: 100%
浏览 93
已结题

面向对象的object has no attribute问题

跟着b站上视频操作的,我觉得还是没有吃透类和对象
class HouseItem:

    def __init__(self,name,area):

        self.name=name
        self.area=area

    def __str__(self):

        return("[%s]占地%2.f"%(self.name,self.area))

class House:

    def __init__(self,house_type,area):

        self.house_type=house_type
        self.area_type=area

        # 剩余面积
        self.free_area = area

        # 家具名称列表
        self.item_list = []

    def __init__(self,house_type,area):

        self.house_type=house_type

        self.area=area

    def __str__(self):

        # python能够自动的将一对括号内部的代码连接在一起
        return ("户型:%s\n总面积:%.2f[剩余:%.2f]\n家具:%s"
        %(self.house_type,self.area,
        self.free_area,self.item_list))

    def add_item(self,item):

            print("要添加%s" % item)
            # 1.判断家具的面积

            if item.area>self.free_area:
                print("%s家具的面积太大了,无法添加" % item.name)

                return
            # 2.将家居的名称添加到列表中
            self.item_list.append(item.name)

            # 3.计算剩余面积
            self.free_area-=item.area
# 1.创建家具
bed=HouseItem("席梦思", 40)
chest=HouseItem("衣柜", 4)
table=HouseItem("餐桌", 20)

print(bed)
print(chest)
print(table)

# 2.创建房子对象
my_home=House("两室一厅",60)

my_home.add_item(bed)
my_home.add_item(chest)
my_home.add_item(table)

print(my_home)

运行结果:

[席梦思]占地40
[衣柜]占地 4
[餐桌]占地20
要添加[席梦思]占地40
Traceback (most recent call last):
  File "D:/Pycharm_Project/pythonProject/08_面向对象基础/hm_12_摆放家具_02_房子类.py", line 69, in <module>
    my_home.add_item(bed)
  File "D:/Pycharm_Project/pythonProject/08_面向对象基础/hm_12_摆放家具_02_房子类.py", line 48, in add_item
    if item.area>self.free_area:
AttributeError: 'House' object has no attribute 'free_area'

我的解答思路和尝试过的方法 上网查说是__两个下划线要换成_一个下划线
我想要达到的结果
  • 写回答

2条回答 默认 最新

  • 关注

    你写了两个__init__函数,后写的将前面写的覆盖了,后面的__init__中没有创建item_list属性,所以下面添加家具时会报错
    改为

    class HouseItem:
        def __init__(self,name,area):
     
            self.name=name
            self.area=area
     
        def __str__(self):
     
            return("[%s]占地%2.f"%(self.name,self.area))
     
    class House:
     
        def __init__(self,house_type,area):
     
            self.house_type=house_type
            self.area_type=area
            self.area=area
     
            # 剩余面积
            self.free_area = area
     
            # 家具名称列表
            self.item_list = []
     
    
     
            
     
        def __str__(self):
     
            # python能够自动的将一对括号内部的代码连接在一起
            return ("户型:%s\n总面积:%.2f[剩余:%.2f]\n家具:%s"
            %(self.house_type,self.area,
            self.free_area,self.item_list))
     
        def add_item(self,item):
     
                print("要添加%s" % item)
                # 1.判断家具的面积
     
                if item.area>self.area:
                    print("%s家具的面积太大了,无法添加" % item.name)
     
                    return
                # 2.将家居的名称添加到列表中
                self.item_list.append(item.name)
     
                # 3.计算剩余面积
                self.free_area-=item.area
    # 1.创建家具
    bed=HouseItem("席梦思", 40)
    chest=HouseItem("衣柜", 4)
    table=HouseItem("餐桌", 20)
     
    print(bed)
    print(chest)
    print(table)
     
    # 2.创建房子对象
    my_home=House("两室一厅",60)
     
    my_home.add_item(bed)
    my_home.add_item(chest)
    my_home.add_item(table)
     
    print(my_home)
     
    

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月8日
  • 已采纳回答 2月28日
  • 创建了问题 2月28日

悬赏问题

  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 linux驱动,linux应用,多线程