Python类属性访问错误求助:城市类代码问题排查
解决你的Python类属性访问错误与代码优化建议
首先,咱们先搞定你遇到的TypeError: type object 'City' has no attribute 'name'错误——这问题出在代码最后一行的print(City.name)上。这里的City是你定义的类本身,而name是你在__init__里给类的实例设置的属性,类本身并没有这个属性,所以直接访问肯定会报错。你应该访问的是某个具体的实例(比如Toronto.name),或者在你的比较函数里正确输出匹配到的实例属性。
接下来咱们梳理下代码里的其他问题,顺便优化一下:
1. 修复city_Compare函数的逻辑问题
你的当前函数在循环时,只要第一个城市不匹配就会立刻打印提示并返回,这样后面的城市根本没机会被检查。比如用户输入"Montreal",第一个循环到Toronto不匹配,直接就输出提示了,根本不会检查Montreal。
2. 修正后的完整代码
class City: def __init__(self, name, country, re_growth10): self.name = name # 城市名称 self.country = country # 所属国家 self.re_growth10 = re_growth10 # 过去10年房价增长率 def city_Info(self): return f"{self.name}, {self.country}, 近10年房价增长率: {self.re_growth10}" # 创建城市实例 toronto = City("Toronto", "Canada", 0.03) montreal = City("Montreal", "Canada", 0.015) user_city_name = input("你想在哪个城市买房?").strip() # 去掉输入前后的空格,避免匹配问题 def city_compare(user_city_name): cities = [toronto, montreal] matched_city = None # 遍历所有城市找匹配项 for city in cities: if city.name.lower() == user_city_name.lower(): # 不区分大小写匹配,更友好 matched_city = city break if matched_city: print(f"找到匹配城市信息:{matched_city.city_Info()}") else: print("我们没有这个城市的信息哦") # 调用比较函数 city_compare(user_city_name)
关键改进点说明
- 类与实例的区分:明确
City是类,toronto、montreal是类的实例,只有实例才有name、country这些属性,类本身没有。 - 循环逻辑优化:先遍历所有城市找到匹配项,再统一处理结果,避免提前终止循环。
- 不区分大小写匹配:用
lower()方法让输入更灵活,比如用户输入"toronto"也能匹配到。 - 代码风格规范:变量名用小写加下划线(PEP8规范),比如
user_city_name而不是user_CityName,可读性更好。 - 利用类方法
city_Info:直接调用实例的方法输出完整信息,比单独打印属性更简洁。
类属性与实例属性的小科普
- 实例属性:就是你在
__init__里用self.xxx定义的属性,每个实例(比如toronto、montreal)都有自己独立的这些属性值。 - 类属性:如果想让所有实例共享某个属性,可以直接在类里定义,比如:
访问类属性可以用class City: planet = "Earth" # 类属性,所有城市实例共享 def __init__(self, name, country, re_growth10): self.name = name # ... 其他属性City.planet或者toronto.planet,两者都能拿到值。
内容的提问来源于stack exchange,提问作者Saad Shahid
相关产品推荐
相关产品推荐

