Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有更好的方法初始化这个类吗?python_Python_Python 3.x - Fatal编程技术网

有更好的方法初始化这个类吗?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()
不会违反他们的规则,可能是因为他们不知道它的存在。我认为他们以代码中的行数而不是代码的可维护性为荣。