覆盖和继承似乎与我的预期不同,让我解释一下这种情况。我有三个班:卡片,宝藏和铜。铜继承自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中的通用值?感谢。
答案 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
的属性。