首页 > 解决方案 > 实例属性,通过 self.__setattr__ 迭代生成。有没有更好的办法?

问题描述

当您从这样的一些可迭代对象中为实例设置属性时:

class DogWith100Legs():
    def __init__(self, legs_colors):
        for leg_i, color in legs_colors.items():
            self.__setattr__(leg_i, color)

legs_colors = {'leg_1': 'white', 'leg_2': 'brown', ... , 'leg_100': 
'black'}
doge = DogWith100Legs(legs_colors)
print(doge.leg_100)

它工作正常。但是 PyCharm 将突出显示 leg_100 并发出警告:“类 'DogWith100Legs' 的未解析引用 'leg_100'。

我为什么要这样做?我想创建树状对象。就像 BeautifulSoup 一样。但是bs4在PyCharm中没有这样的问题

此外,在类似的问题中有评论(比如PyCharm 警告 dict 生成的属性的未解析属性),人们说这是一种不好的做法

什么是好的做法?或者您是否知道让 Pycharm 平静下来的好方法?(不禁用 Pycharm 检查)

标签: pythonpycharm

解决方案


PyCharm(和所有其他 IDE)会给你警告/错误,因为__init__你必须声明对象的每个成员。

因为您正在传递一个 dict,所以最好的办法可能是将 dict 也实例化到您的类中,然后使用 keyself.my_dict['leg_x']而不是self.leg_x.

class DogWith100Legs():
def __init__(self, legs_colors):
    self.legs_colors = legs_colors.copy()

legs_colors = {'leg_1': 'white', 'leg_2': 'brown', 'leg_100': 'black'}
doge = DogWith100Legs(legs_colors)
print(doge.legs_colors['leg_100'])

推荐阅读