[英]How can I make my subclasses more efficient?
我正在創建一個游戲,對於單位/角色,我有一個名為 Unit 的基類,看起來像這樣。
class Unit:
def __init__(self, name, ally=False):
self.ac = 10
self._name = name
self.name = self._name
self.ally = ally
self._hp = 10
self.hp = self._hp
self._str = 0
self.str = self._str
self._dex = 0
self.dex = self._dex
self._con = 0
self.con = self._con
self._stat 應該代表沒有 buffs 或 debuffs 的基本 stat,默認值,self.stat 是在整個游戲中使用和更改的那個。
然后我有使用 Unit 作為基類的子類,就像這樣。
class Fighter(Unit):
def __init__(self, name, ally=False):
super().__init__(name, ally)
self._con = 3
self.con = self._con
self._hp = 10 + self._con
self.hp = self._hp
self._str = 3
self.str = self._str
self._dex = 1
self.dex = self._dex
但是如果我可以最小化我需要為我的子類的init方法重寫多少,我會更喜歡它,我認為由於 self.stat attrs 在創建時引用了 self._stat 我可以做更多這樣的事情
class Fighter(Unit):
def __init__(self, name, ally=False):
super().__init__(name, ally)
self._con = 3
self._hp = 10 + self._con
self._str = 3
self._dex = 1
並認為由於 self.stat attrs 引用 self._stat 進行分配,我可以更改 self._stat 的分配,它會調整我需要的所有內容,但這不是發生的事情,如果我只是更改 self. _stat 然后 self.stat 保持與 Base 類相同,只是更改了 self._stat。
在制作新課程時,我是否可以采用不同的方式來構建它以使統計分配更容易且更少冗長?
你應該以更抽象的方式設計你的類來實現你的目標。 讓我們來看看“hp”這個東西。
我們可以看到單位有特定的生命值,以及戰士。 我們還可以看到,您為戰士的 hp 添加了“con”值。 我們還可以看到,Unit 具有“con = 0”。 所以實際上,我們可以重寫它:
>>> class Unit:
... def __init__(self, name, hp, con):
... self.name = name
... self._name = name
... self.hp = hp + con
... self._hp = hp
... self.con = con
... self._con = con
>>> class Warrior(Unit):
... pass
現在我們可以看到,這些類基本上是等價的,因為 Warrior 類沒有提供任何額外的邏輯。 所以請注意,你應該只在子類擴展其父邏輯的情況下這樣做。
現在如果你想覆蓋一些特定於類的邏輯,你應該使用 Unit 作為抽象類。
from abc import ABCMeta, abstractmethod, abstractproperty
class Unit:
__metaclass__ = ABCMeta
def __init__(self, name, hp, con):
self.name = name
self._name = name
self.con = con
self._con = con
self._hp, self.hp = self._init_hp(hp)
@abstractmethod
def heal():
"""Heal unit"""
@abstractmethod
def _init_hp():
"""Calculate self._hp and self.hp values"""
class Warrior(Unit):
def heal(self):
self.hp += 5
def _init_hp(self, hp):
"""Just an example, no logic here"""
return hp, hp * 2 + self.con
class Villager(Unit):
def heal(self):
self.hp += 1
def _init_hp(self, hp):
"""Just an example, no logic here"""
return hp / 2, hp - 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.