【发布时间】:2013-12-06 11:26:11
【问题描述】:
我目前正在自学 Python,并且上过关于继承的课程,所以这是我第一次接触子类。我正在从“Think Python”一书中学习,这个例子是关于创建代表扑克牌、甲板、手牌等的类。下面的例子是从这本书中复制的(我自己添加了一个或两个方法,作为练习):
import random
from operator import itemgetter, attrgetter
class Card:
"""represents a standard playing card."""
def __init__(self, suit=0, rank=2):
self.suit = suit
self.rank = rank
suit_names = ['Clubs', 'Diamonds', 'Hearts', 'Spades']
rank_names = [None, 'Ace', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'Jack', 'Queen', 'King']
def __str__(self):
return '%s of %s' % (Card.rank_names[self.rank], Card.suit_names[self.suit])
def __cmp__(self, other):
t1 = self.suit, self.rank
t2 = other.suit, other.rank
return cmp(t1, t2)
class Deck:
"""represents a standard deck of cards"""
def __init__(self):
self.cards = []
for suit in range(4):
for rank in range(1, 14):
card = Card(suit, rank)
self.cards.append(card)
def __str__(self):
res = []
for card in self.cards:
res.append(str(card))
return '\n'.join(res)
def pop_card(self):
return self.cards.pop()
def add_card(self):
self.cards.append(card)
def shuffle(self):
random.shuffle(self.cards)
def sort(self):
self.cards.sort(key=attrgetter('suit', 'rank'))
class Hand(Deck):
"""represents a hand of playing cards"""
def __init__(self, label=''):
self.cards = []
self.label = label
def move_cards(self, hand, num):
for i in range(num):
hand.add_card(self.pop_card())
我的问题是 Hand 子类方法。如果我尝试从 Hand 子类调用 move_cards 方法,例如使用a = Deck()、b = Hand(),尝试调用move_cards(b,2) 或a.move_cards(b,2) 给我同样的AttributeError: 'Deck' object has no attribute 'move_cards'。
为什么会发生这种情况或我做错了什么?谢谢。
【问题讨论】:
-
您的
a对象仍然是Deck实例,因此它对move_cards方法一无所知。使用继承时,子类继承超类的行为,而不是相反。
标签: python inheritance python-3.x parent-child subclass