python - 实例属性,通过 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 检查)
解决方案
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'])
推荐阅读
- google-bigquery - 如何计算 BigQuery 中分区的平均事件频率
- mysql - 通过 Mysql 反应原生 json 解析
- c# - 如何再次单击将返回游戏的退出键?
- python - 使用 Jyupter Notebook 导入 GDAL 和 ogr 时遇到问题
- c# - 我的 If/else 语句未正确执行
- c++ - 使用 getline(cin.input) 在 while 循环中输入字符串
- bootstrap-4 - 使用“npm i bootstrap”安装时如何在 HTML 中包含 Bootstrap JS 文件
- ruby - sinatra 中的会话和创建哈希是否相似?
- git - 我正在尝试使用 git rebase -i 但我得到一个 noop 错误
- r - 使用数据框列的名称作为过滤数据框中该列的函数的参数值