这对我来说是一个非常令人尴尬的第一篇文章 - 在6个月前学习基础知识后再回到Python编码,从那时起就不再使用它了。
我在面向对象的方法中编写了一个Blackjack游戏,并定义了一个Deck对象,如下所示:
class Deck(object):
suits = ["spades", "clubs", "diamonds", "hearts"]
ranks = ["2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King", "Ace"]
def __init__(self):
self.spades = {"2": 0, "3": 0, "4": 0, "5": 0, "6": 0, "7": 0, "8": 0, "9": 0, "10": 0, "Jack": 0, "Queen": 0, "King": 0, "Ace": 0}
self.clubs = {"2": 0, "3": 0, "4": 0, "5": 0, "6": 0, "7": 0, "8": 0, "9": 0, "10": 0, "Jack": 0, "Queen": 0, "King": 0, "Ace": 0}
self.diamonds = {"2": 0, "3": 0, "4": 0, "5": 0, "6": 0, "7": 0, "8": 0, "9": 0, "10": 0, "Jack": 0, "Queen": 0, "King": 0, "Ace": 0}
self.hearts = {"2": 0, "3": 0, "4": 0, "5": 0, "6": 0, "7": 0, "8": 0, "9": 0, "10": 0, "Jack": 0, "Queen": 0, "King": 0, "Ace": 0}
之后,我想创建一个简洁的方法来启动这个套牌,通过填写每个套装中的等级数量来填充所有4个字典,通过写下面的内容(这就是我在上面定义的类属性的原因:
def initialize_deck(self):
for suit in self.suits:
for rank in self.ranks:
self.suit[rank] = 1
问题是,代码不执行我认为它应该做的事情(例如:从self.suits列表中拉出第一个套装,使用它作为字典的名称迭代其所有键并设置它们关联值为1)。相反,我只是得到一个错误“AttributeError:'Deck'对象没有属性'suit'”。
我在这里做错了什么?是否有一种巧妙的方式用2个嵌套循环编写我的想法,而不是像下面那样编写它?
def initialize_deck(self):
for rank in self.ranks:
self.spades[rank] = 1
for rank in self.ranks:
self.clubs[rank] = 1
for rank in self.ranks:
self.diamonds[rank] = 1
for rank in self.ranks:
self.hearts[rank] = 1
提前感谢我所知道的答案可能是一个非常基本的问题。
干杯
答案 0 :(得分:1)
您可以使用getattr
函数从对象获取属性
def initialize_deck(self):
for suit in self.suits:
suit_dict = getattr(self, suit)
for rank in self.ranks:
suit_dict[rank] = 1
或者您可以使用setattr
def initialize_deck(self):
rank_map = {key: 1 for key in self.ranks}
for suit in self.suits:
setattr(self, suit, rank_map.copy())