有更好的方法初始化这个类吗?python
我正在从一个数据库中传入一行,该数据库正在作为元组读入。我喜欢所有子类都可以使用这些属性的想法,但这感觉不需要太多行就可以做到。有更好的方法吗有更好的方法初始化这个类吗?python,python,python-3.x,Python,Python 3.x,我正在从一个数据库中传入一行,该数据库正在作为元组读入。我喜欢所有子类都可以使用这些属性的想法,但这感觉不需要太多行就可以做到。有更好的方法吗 class Player(): def __init__(self, player_attributes): self.player_id = player_attributes[0] self.player_first_name = player_attributes[1] self.player
class Player():
def __init__(self, player_attributes):
self.player_id = player_attributes[0]
self.player_first_name = player_attributes[1]
self.player_last_name = player_attributes[2]
self.player_date_of_birth = player_attributes[3]
self.player_city_of_birth = player_attributes[4]
self.player_state_of_birth = player_attributes[5]
self.player_height = player_attributes[6]
self.player_weight = player_attributes[7]
self.player_age = player_attributes[8]
self.player_hair_color = player_attributes[9]
self.player_favorite_food = player_attributes[10]
self.player_favorite_sport = player_attributes[11]
...(20 more attributes)
您可以使用for循环和
\u dict\u
属性
使用字典而不是列表和此模板:
类测试:
定义初始(自我,词汇):
对于术语项()中的k,v:
self.\uu dict\uu[k]=v
你能像字典一样存储玩家属性吗?如果能,你可以使用这样的技巧:
class A:
def __init__(self, d):
self.__dict__.update(d)
if __name__ == '__main__':
a = A({'k': 123, 'd': 34})
print(a.k)
您可以使用dataclass
from dataclasses import dataclass
@dataclass
class Player:
player_id: str
player_first_name: str
player_attributes = ('713', 'Jack')
player: Player = Player(*player_attributes)
print(player)
输出
Player(player_id='713', player_first_name='Jack')
您可以使用
locals()
方法进行动态赋值
class Player:
def __init__(self, db_record):
for i,k in enumerate(('player_id', 'first_name', 'last_name', 'age')):
locals()[k] = db_record[i]
# Clean up local variables
del db_record
del i
del k
# Assign the local variables to __dict__
self.__dict__.update(locals())
def dump(self):
print(repr(self.__dict__))
你听说过iterable解包吗?“不用那么多行就可以完成”:嗯,这些属性的名称必须在某处键入。。。这就是你的大部分代码。边注:为什么所有这些名字都必须从<代码> PraveRe<代码>开始,当类名已经暗示玩家是这些属性的时候?<代码> SETATOR将是另一个考虑的选项。“使用字典而不是列表”-但是…输入是来自数据库的元组…为什么要使用
locals()
?为什么不干脆self.\uu dict\uuk]=db\u record[i]
?还有为什么会出现del
s?这就是Python…过去,我一直被高级开发人员批评为添加到self中。直接,这是我的工作locals()
是本地符号表,它包含变量db_record
、i
和k
,因此必须删除这些变量,除非我们想将它们保留为对象的属性。对于最终没有真正解决的问题,这似乎非常奇怪。。。有人告诉你不要使用\uuuu dict\uuuu
,但你却用了它。。。那么,为什么不让代码更合理,直接在循环中分配给它呢?他们最初希望构造函数包含100多个手动分配,并且不允许使用setattr()
。我被指示不要像你建议的那样使用循环直接分配给self.\uu dict\uuuk]
,但我没有。相反,我分配给了locals()
,并用它更新了\uuuu dict\uuu
。与我打交道的人非常迂腐,使用locals()
不会违反他们的规则,可能是因为他们不知道它的存在。我认为他们以代码中的行数而不是代码的可维护性为荣。