簡體   English   中英

我怎樣才能讓我的子類更有效率?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM