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中的通用值?谢谢.
实现这一点的更合理的方法是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
访问 的属性。Treasure
Treasure
归档时间: |
|
查看次数: |
63 次 |
最近记录: |