You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python面向对象编程房地产程序跨类访问变量及中介属性列表打印问题

代码问题排查与修复方案

核心问题根源

  • 多重继承的组合类实现错误,没有把物业属性和交易属性合并到同一个实例,拆成了两个独立对象,导致属性分散
  • 用全局变量传递交易属性的设计存在缺陷,全局值会被后续操作覆盖,无法和具体物业绑定,传值必然失效
  • Agent类的存储、遍历逻辑错位:没有把完整物业对象存入列表,而是零散存字符串,遍历时索引逻辑完全错误,自然读不到其他属性

逐点修复说明

1. 修正多重继承的组合类实现

原来的ApartmentRental这类组合类,本来应该是「同时拥有物业属性(面积、卧室)和交易属性(租金/售价)的完整对象」,但原写法只是返回两个独立对象的元组,完全没有合并属性。

  • 原错误写法示例:
class ApartmentRental(Apartment, Rental):
    def __init__(self):
        super().__init__(Apartment, Rental) # 错误:把父类本身当参数传入
    @staticmethod
    def prompt_init():
        prompt1 = Apartment.prompt_init()
        prompt2 = Rental.prompt_init()
        return prompt1, prompt2 # 错误:返回两个独立对象,未合并属性
  • 修正后的写法(所有组合类都按这个逻辑调整):
class ApartmentRental(Apartment, Rental):
    def __init__(self, square_feet, num_bedrooms, num_bathrooms, balcony, laundry, furnished, utilities, rent):
        # 按继承顺序传参:Apartment的参数在前,Rental的参数在后
        super().__init__(square_feet, num_bedrooms, num_bathrooms, balcony, laundry, furnished, utilities, rent)
    
    @classmethod
    def prompt_init(cls):
        # 收集Apartment需要的属性
        square_feet = input("物业面积为多少平方英尺?:")
        num_bedrooms = input("有多少间卧室?:")
        num_bathrooms = input("有多少间卫生间?:")
        balcony = input("是否配有阳台?:")
        laundry = input("是否配有洗衣设施?:")
        # 收集Rental需要的属性
        furnished = input("出租物业是否家具齐全?:")
        utilities = input("每月水电杂费为多少?:")
        rent = input("月租金是多少?:")
        # 返回合并后的完整物业实例
        return cls(square_feet, num_bedrooms, num_bathrooms, balcony, laundry, furnished, utilities, rent)

注意:ApartmentPurchase、HouseRental、HousePurchase三个组合类都要按这个逻辑修改,把所有父类的参数收集完成后返回合并实例,不要再拆成两个独立对象。


2. 彻底废弃全局变量传值

原代码里global rent、global price的写法,只要后续新增第二个物业,全局值就会被覆盖,完全无法区分不同物业的属性。

  • 直接删除所有global rent、global price的代码,所有交易属性直接存在对应组合类的实例里,不需要额外全局中转。

3. 修正Agent类的存储逻辑

原add_property方法只是把地址、物业类型这些零散字符串append到self.properties,根本没存完整的物业对象,导致后续读不到任何属性。

  • 修正后的add_property直接把组合类返回的完整实例存入self.properties:
def add_property(self):
    # 修正原判断逻辑:之前判断的是Agent类本身,不是当前创建的中介实例self,永远判断不准
    if self not in Agent.agentlist:
        Agent.agentlist.append(self)
    
    address = input("物业街道地址是什么?:")
    property_type = input("该物业为住宅还是公寓?:").lower()
    purchase_type = input("该物业用于出租还是出售?:").lower()
    
    # 从映射表拿到对应的组合类
    listing_class = self.listing_type[(property_type, purchase_type)]
    # 调用组合类的prompt_init拿到完整物业实例
    property_instance = listing_class.prompt_init()
    # 给实例补存地址属性
    property_instance.address = address
    # 直接把完整实例存入当前Agent的物业列表
    self.properties.append(property_instance)

4. 修正list_properties的遍历逻辑

原list_properties循环的是Agent.agentlist的长度,再去取self.properties[i],逻辑完全错位:self.properties是当前Agent自己的物业列表,直接遍历这个列表即可,不需要操作全局的agentlist:

def list_properties(self):
    print(f"\n=== 中介名下物业列表 ===")
    # 直接遍历当前Agent存储的所有物业实例
    for prop in self.properties:
        print(f"物业地址:{prop.address}")
        # 直接调用实例的display方法,自动打印所有物业+交易属性
        prop.display()
        print("-"*30)

5. 修复混合类的display方法报错问题

原Purchase、Rental类的display里调用了super().display(),但这两个类本身没有继承Property,父类是object,根本没有display方法,一调用就会报错。

  • 直接删除Purchase、Rental类里的super().display()调用即可,组合类的*MRO(方法解析顺序)*会自动先调用物业类的display,再调用交易类的display:
# 修正后的Purchase类display
def display(self):
    print(f'该物业为出售属性\n售价:{self.price}\n物业税:{self.taxes}')

# 修正后的Rental类display
def display(self):
    print(f'该物业为出租属性\n月租金:{self.rent}\n水电杂费:{self.utilities}\n是否家具齐全:{self.furnished}')

最终可运行的验证逻辑

修改完成后,初始化、添加、列示物业的流程完全正常:

# 删掉原代码里的全局空值初始化代码
# rent = ''
# price = ''

agent1 = Agent()
agent1.add_property()

print("Agent1的物业列表:")
agent1.list_properties()

运行输入参数后,就能直接打印出每套物业的地址、面积、卧室数、交易类型、售价/租金等所有属性,不会再出现读不到属性的问题。


内容的提问来源于stack exchange,提问作者Sarah Baker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.26 04:15:05