首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >利用类中的相同属性

利用类中的相同属性
EN

Stack Overflow用户
提问于 2020-06-16 04:44:00
回答 2查看 41关注 0票数 1

在这里的这个类中:

代码语言:javascript
运行
复制
class Hero():
    def __init__(self, Type, name):
        self.Type = Type
        self.name = name
        self.atk = 'Undefined'

        if Type == 'Paladin':
            self.hp = 150
            self.dmg = [10, 20]
            self.atk = random.randint(self.dmg[0], self.dmg[1])
            self.defence = 25
            self.dodge = 5

        elif Type == 'Mage':
            self.hp = 70
            self.dmg = [60, 70]
            self.atk = random.randint(self.dmg[0], self.dmg[1])
            self.defence = 15
            self.dodge = 8

        elif Type == 'Archer':
            self.hp = 100
            self.dmg = [40, 50]
            self.atk = random.randint(self.dmg[0], self.dmg[1])
            self.defence = 10
            self.dodge = 13

我注意到我总是对每个if语句使用hp、dmg、atk、defence、dodge。既然python是面向对象的,那么有没有办法利用这一点而不需要手动编写所有这些东西呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-16 04:52:07

您可以使用inheritance并创建Hero类的3个子类来移动代码。

Hero类,您可以在其中编写util方法来创建不同类型的Hero

代码语言:javascript
运行
复制
class Hero():
    def __init__(self, Type, name):
        self.name = name
        self.atk = 'Undefined'

    def _init_atk(self):
        self.atk = random.randint(self.dmg[0], self.dmg[1])

    @staticmethod
    def get_hero(hero_type, name):
        if hero_type == 'Paladin':
          return Paladin(name)
        elif hero_type == 'Mage':
          return Mage(name)
        elif hero_type == 'Archer':
          return Archer(name)
        return None

英雄类,它们定义了自己的属性值

代码语言:javascript
运行
复制
class Paladin(Hero):
    def __init__(self,name):
        super(Paladin, self).__init(name)
        self.hp = 150
        self.dmg = [10, 20]
        self.defence = 25
        self.dodge = 5
        self._init_atk()

class Mage(Hero):
    def __init__(self,name):
        super(Mage, self).__init(name)
        self.hp = 70
        self.dmg = [60, 70]
        self.defence = 15
        self.dodge = 8
        self._init_atk()

class Archer(Hero):
    def __init__(self,name):
        super(Archer, self).__init(name)
        self.hp = 100
        self.dmg = [40, 50]
        self.defence = 10
        self.dodge = 13
        self._init_atk()

然后你可以创建像这样的对象

代码语言:javascript
运行
复制
a = Archer("RobinHood")
b = Hero.get_hero("Mage", "HarryPotter")
票数 3
EN

Stack Overflow用户

发布于 2020-06-16 11:39:29

您可以使用继承从超类派生各种Hero Characters,并为每个新类型提供一组特定的值;您还可以为它们提供特定的属性和行为:

使用类变量来存储值可以简化代码:

代码语言:javascript
运行
复制
from abc import ABC
import random


class Hero(ABC):   # this cannot be instantiated 
    def __init__(self, name):
        self.name = name
        self.atk = random.randint(self.dmg[0], self.dmg[1])
        self.hp = self.__class__.hp
        self.dmg = list(self.__class__.dmg)
        self.defence = self.__class__.defence
        self.dodge = self.__class__.dodge
    def __str__(self):
        return f'{self.__class__.__qualname__}: {self.name}, atk: {self.atk}, hp: {self.hp}, dmg: {self.dmg}, defense: {self.defence}, dodge: {self.dodge}'


class Paladin(Hero):
    hp = 150
    dmg = (10, 20)
    defence = 25
    dodge = 5
    def __init__(self, name):
        super().__init__(name)


class Mage(Hero):
    hp = 70
    dmg = (60, 70)
    defence = 15
    dodge = 8
    def __init__(self, name, spells):
        super().__init__(name)
        self.spells = spells[:]
    def __str__(self):
        return f'{super().__str__()}\n\tspells: {self.spells}'


class Archer(Hero):
    hp = 100
    dmg = (40, 50)
    defence = 10
    dodge = 13
    def __init__(self, name):
        super().__init__(name)


A = Archer('Guillaume Tell')
B = Mage('Gandalf', ['quadratus lumborum', 'rectus femoris'])
C = Paladin('Ali Baba')

print(A)
print(B)
print(C)

输出:

代码语言:javascript
运行
复制
Archer: Guillaume Tell, atk: 49, hp: 100, dmg: [40, 50], defense: 10, dodge: 13
Mage: Gandalf, atk: 62, hp: 70, dmg: [60, 70], defense: 15, dodge: 8
    spells: ['quadratus lumborum', 'rectus femoris']
Paladin: Ali Baba, atk: 13, hp: 150, dmg: [10, 20], defense: 25, dodge: 5
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62396692

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档