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

neo*_*k23 5 python inheritance python-3.x

覆盖和继承似乎与我的预期不同,让我解释一下这种情况.我有三个班:卡片,宝藏和铜.铜继承自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
Run Code Online (Sandbox Code Playgroud)

宝藏类:

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
Run Code Online (Sandbox Code Playgroud)

铜级:

from card.basic.card_treasure import Treasure


class Copper(Treasure):
    pile_player_rate = 60
Run Code Online (Sandbox Code Playgroud)

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

sch*_*ggl 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
Run Code Online (Sandbox Code Playgroud)

您可以在 上实现此方法,并且无需重写它,它就会在 上调用时Card访问 的属性。TreasureTreasure