Python 继承和重载方法

Python 继承和重载方法,python,inheritance,overloading,Python,Inheritance,Overloading,我创建了一个名为Card的类,它接受一个数字,并根据调用的方法提供以下输出: class Card: def __init__(self, number): self.number = number def suit(self): if self.number in range(0, 13): return 0 elif self.number in range(13, 26): return 1 elif self.numbe

我创建了一个名为Card的类,它接受一个数字,并根据调用的方法提供以下输出:

class Card:

def __init__(self, number):
    self.number = number

def suit(self):
    if self.number in range(0, 13):
        return 0
    elif self.number in range(13, 26):
        return 1
    elif self.number in range(26, 39):
        return 2
    elif self.number in range(39, 52):
        return 3

def rank(self):
    if self.number in range(0, 13):
        return self.number
    elif self.number in range(13, 26):
        return self.number - 13
    elif self.number in range(26, 39):
        return self.number - 26
    elif self.number in range(39, 52):
        return self.number - 39

def points(self):
    if self.number in (12,25,38,51):
        return 4
    elif self.number in (11,24,37,50):
        return 3
    elif self.number in (10,23,36,49):
        return 2
    elif self.number in (9,22,35,48):
        return 1
    else:
        return 0
def __repr__(self):
    ranks = ['2','3','4','5','6','7','8','9','10','J','Q','K','A']

    if self.number in range(0, 13):
        return ranks[self.number] + '\u2663'

    elif self.number in range(13, 26):
        return ranks[self.number - 13] + '\u2666'

    elif self.number in range(26, 39):
        return ranks[self.number - 26] + '\u2665'

    elif self.number in range(39, 52):
        return ranks[self.number - 39] + '\u2660'

def __lt__(self,other):
    if str(self.rank) < str(other.rank):
        return True
    else:
        return False
类卡:
定义初始化(自身,编号):
self.number=number
def套装(自我):
如果self.number在范围(0,13)内:
返回0
elif self.number在范围(13,26)内:
返回1
elif self.number在范围(26,39)内:
返回2
范围(39,52)内的elif自我编号:
返回3
def等级(自我):
如果self.number在范围(0,13)内:
返回自我编号
elif self.number在范围(13,26)内:
返回自我编号-13
elif self.number在范围(26,39)内:
返回自我编号-26
范围(39,52)内的elif自我编号:
返回自我编号-39
def点(自身):
如果自编号在(12,25,38,51)中:
返回4
(11,24,37,50)中的elif自我编号:
返回3
(10,23,36,49)中的elif self.number:
返回2
(9,22,35,48)中的elif self.number:
返回1
其他:
返回0
定义报告(自我):
排名=['2','3','4','5','6','7','8','9','10','J','Q','K','A']
如果self.number在范围(0,13)内:
返回等级[self.number]+'\u2663'
elif self.number在范围(13,26)内:
返回等级[self.number-13]+'\u2666'
elif self.number在范围(26,39)内:
返回等级[self.number-26]+'\u2665'
范围(39,52)内的elif自我编号:
返回等级[self.number-39]+'\u2660'
定义(自身、其他):
如果str(self.rank)
*任何关于改进代码的提示都将不胜感激

现在我必须编写一个名为BlackjackCard的类,继承了Card类:

class BlackjackCard(Card):

def __init__(self, number):
    Card.__init__(self, number)

def points(self):

    if self.rank == 12:
        return 11
    elif self.rank in (11,10,9):
        return 10
    elif self.rank < 11:
        return self.rank
等级黑卡(卡):
定义初始化(自身,编号):
卡片。u_初始(自我,编号)
def点(自身):
如果self.rank==12:
返回11
elif self.rank in(11,10,9):
返回10
elif self.rank<11:
返回自我等级
我试图通过重写来重载方法points(),但似乎无法从类Card实现self.rank。 当我分配
y=BlackjackCard(38)
并执行
y.points()
时,它会给我一个
类型错误:无序类型:方法()


我做错了什么?self.rank是一种方法。要么通过添加paren(
self.rank()
)调用它,要么将其转换为属性。

Ignacio的答案是正确的(使用
属性)
),但在总体上改进代码方面,有几点建议


首先,如果foo在(a,b)范围内,你可以做
,而不是
:如果提示:检查的重复性应该提示你有更好的方法。你怎么能用数学而不是一连串的if/else语句来计算西装、等级和分数呢?(作为一个提示,试着使用除法和模运算符。)我非常同意代码是重复的,但我怎样才能使它更简单?你能给我举一个例子吗?我已经计算出了方法等级和方法适合度的数学关系。再次感谢!非常感谢。我不知道你是怎么打电话给我的哇,太谢谢你了。这帮了大忙!但是@property代表什么呢?它有什么作用?不确定我们是否知道是的,这是伊格纳西奥的建议。通常,当您想要执行一个方法时,您可以执行类似于
myhand.rank()
的操作。但是,如果该方法不接受任何输入(对象除外,
self
),则可以使用
@属性
装饰器对其进行更改,以便使用以下语法:
myhand.rank
。它似乎与向用户获取属性相同(如
myhand.number
),但在本例中,它是只读的。您还可以将
属性设置为可写,但在这种情况下不需要这样做。
class Card:
    def __init__(self, number):
        self.number = number

    @property
    def suit(self):
        return self.number // 13

    @property
    def rank(self):
        return self.number % 13

    @property
    def points(self):
        return max(0, self.rank-8)

    @property
    def suit_str(self):
        suits = ['\u2663', '\u2666', '\u2665', '\u2660']
        return suites[self.suit]

    @property
    def rank_str(self):
        ranks = {9: 'J', 10: 'Q', 11: 'K', 12: 'A'}
        return ranks.get(self.rank, str(self.rank+2))

    def __repr__(self):
        return self.rank_str+self.suit_str

    def __lt__(self, other):
        return self.rank < other.rank