【发布时间】:2019-12-16 17:27:13
【问题描述】:
我想表示一个类似于无序卡片组的结构(例如,在 Python 3.7 中),它具有可以将单张卡片视为一副卡片的属性。
class Deck:
def __init__(self, cards, owner):
self.owner = owner
self.cards = cards
class Card(Deck):
def __init__(self, number, suit, owner):
self.number = number
self.suit = suit
super().__init__({self}, owner)
def __eq__(self, other):
return self.number == other.number and self.suit == other.suit and self.owner == other.owner
def __hash__(self):
return hash((self.number, self.suit, self.owner))
card = Card(5, 'clubs', 'me')
(以上返回AttributeError: 'Card' object has no attribute 'owner')
如果我想订购我的套牌,这很简单,因为Card.__init__() 只会将列表[self] 传递给Deck.__init__()。但是,我不能只将{self} 传递给Deck.__init__(),因为Card.__hash__() 可能需要已经设置了Deck 属性!有很多解决方法;我可以简单地在Card.__init__() 中设置self.owner = owner,或者我可以将[self] 传递给Deck.__init__(),然后在正文中设置self.cards = set(cards),但在我看来,代码的其他部分应该取决于甲板选择存储它的卡片。因此,我的问题不是如何编码,而是设计这种关系的最佳方式,这样我就不必担心这些问题。有什么想法吗?
我搜索了这个问题并没有找到任何东西,但这很简单,所以如果它是重复的,我很抱歉。感谢阅读!
编辑:如果一副纸牌对我的结构来说是一个不好的类比,一个(希望)更准确的类比是一个多项式,它是单项式的总和,但每个单项式也是一个多项式,它本身就是一个术语.
【问题讨论】:
-
这对我来说毫无意义。当它显然是组合时,为什么要在继承中使用鞋拔呢?更好的设计方法是不使用继承。我的意思是,由一组卡片组成的套牌就像许多教程中使用的 OOP 的典型示例。
-
我选择了一副牌来使我的例子尽可能简单,但也许那是个错误。这里的关键问题是关于具有上述属性的结构,而不是表示一副纸牌的最佳方式!
-
你的结构本质上是没有意义的。您将事物容器与单个事物混淆。即使是这种情况,将 Card 类与在一起也没有任何意义。 为什么在这里使用继承?它完成什么?它从根本上不符合继承模型。即使在您的多项式示例中,为什么要使用继承?您的多项式类将简单地跟踪它的度数,因此单项式不会是子类,它只会具有度数 1。内置函数中的一个示例是
str对象,其中包含其他str对象。
标签: python inheritance hash subclass self-reference