如何深入覆盖类属性两个级别?

时间:2018-01-10 13:46:40

标签: python python-3.x inheritance

覆盖和继承似乎与我的预期不同,让我解释一下这种情况。我有三个班:卡片,宝藏和铜。铜继承自Treasure和Treasure继承自Card。 Treasure和Card之间的唯一区别是Treasure覆盖的单一方法。 Treasure和Copper之间的唯一区别是Copper覆盖的属性。 Copper覆盖的属性最初来自Card,它是Treasure在其独特方法中使用的属性。我遇到的问题是,当调用Copper的方法它继承自Treasure时,它仍然使用Card的属性值,而不是Copper应该覆盖它的属性值。以下是一些代码,感谢任何帮助。

卡类:

class Card:
    normal_full_table = 6
    pile_player_rate = 10

    @staticmethod
    def pile_setup(player_count):
        pass

宝藏班:

from card.card import Card
from math import floor

class Treasure(Card):
    @staticmethod
    def pile_setup(player_count):
        return (floor(player_count/Card.normal_full_table) + 1) * Card.pile_player_rate

铜类:

from card.basic.card_treasure import Treasure


class Copper(Treasure):
    pile_player_rate = 60

我期望发生的是当Copper.pile_setup(6)被调用时,值pile_player_rate为60,因为Copper覆盖了该值但是在检查时它仍然是10.为什么会这样?这是因为我说具体是Card.pile_player_rate吗?我怎样才能让Copper使用它为pile_player_rate的唯一值而不是Card中的通用值?感谢。

1 个答案:

答案 0 :(得分:4)

实现这一点的更健全的方法是classmethod。这允许您动态访问调用该方法的类的属性:

class Treasure(Card):
    @classmethod
    def pile_setup(cls, player_count):
        return (floor(player_count/cls.normal_full_table) + 1) * cls.pile_player_rate

您可以在Card上实施此方法,如果不覆盖它,则会在Treasure上调用时访问Treasure的属性。