Python创建单个对象/类的多个实例

2024-05-19 01:42:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我在用Python。我读了一点关于这个的书,似乎无法把我的思想集中起来。我想做的是有一个叫做魔药的类,里面有各种魔药对象。现在只有一种药水,一种简单的保健药水。我希望药水可以堆放在库存和商店库存中。所以我需要一个库存药水数量的实例和一个携带药水的商店存货的实例。药水的数量是动态的,用于购买/出售和掠夺药水。如果有人能提供一个基本的解释或例子,这将是伟大的。

以下是我的一小部分:

class Potion(Item):
    def __init__(self, name, desc, val, amt, type, effect, bound):
        Item.__init__(self, name, desc, val, amt, type, effect, bound)

        self.name = name
        self.desc = desc
        self.val = val
        self.amt = amt
        self.type = 0 #Restorative
        self.effect = effect

   def use(self, you):
    #Use health potion
        you.hp_current += self.effect
        you.displayStats()

#Format: Name, Description, Value, Amount, Type, Effect, Bound
HealthPotion = Potion('Health Potion', 'Restores 10 hit points when consumed', 10, 0, 
0, 10, 0)

理想情况下,默认值设置为0,我可以声明某个商店的库存将从多少开始。库存和车间库存被设置为一个数组,用于向/从中追加和移除项目。我想我已经搞定了这个方法的逻辑,我只是在计算数量时遇到了麻烦。

编辑:这是我在buy方法中的一部分,用来查看不使用实例时会发生什么。它很难看,我发现you.inventory.y.amt不起作用。是从“商店”中显示的项目列表中选择的项目

            x = selection - 1 #Item menu starts at 1. But arrays start at 0. So it takes user input and subtracts 1 to match the array.
            y = self.stock[x]

            if y.val <= you.coin:
                if y.amt == 0:
                    you.inventory.append(y)
                    you.inventory.y.amt += 1
                else:
                    you.inventory.y.amt += 1;

                you.coin -= y.val
                self.funds += y.val

                if self.stock.y.amt > 1:
                    self.stock.y.amt -= 1
                else:
                    self.stock.y.amt -= 1
                    self.stock.pop(x)

我看过这样的例子:

class foo: 
a = 1 
i = foo() 
foo.a => 1 
i.a => 1 
i.a = "inst" 
foo.a => 1
i.a => "inst"

我想知道我是否不只是创建第二个健康药水对象,但这听起来不对。这个例子让我有了不同的想法。也许我只是不懂举例。

“这将创建Employee类的第一个对象”

emp1 = Employee("Zara", 2000)

“这将创建Employee类的第二个对象”

emp2 = Employee("Manni", 5000)

谢谢!


Tags: 对象nameselfyoufoostock库存employee
2条回答

这里的代码使用了非常混乱的命名约定,我想这会让您感到困惑——HealthPotion不是一个类,它是一个实例,但CamelCase名称表明它是python中的一个类。

要使用你的药剂类有多种健康药剂,只需

health_potion_1 = Potion("Health Potion", ...)
health_potion_2 = Potion("Health Potion", ...)
foobar_potion_1 = Potion("Foobar Potion", ...)
#...

虽然这是一个相当糟糕的风格,你可能想要的是有一种方法可以很容易地创建健康和类似的药水,具有相同的属性和不同的效果药水

要做到这一点你应该

class HealthPotion(Potion):
    def __init__(self, name="Health Potion", effect=10):
        super(HealthPotion, self).__init__(name, "Restores %d points of health" % (effect, ), effect, 0, 0)
    def use(self, you):
        you.hp_current+=self.effect

如果你想在一个清单中有多个项目,最简单的方法是为你的清单创建一个列表(或集合或集合),并且在列表中有多个实例,例如

inventory = [HealthPotion(), HealthPotion()]

如果你想做堆叠,我仍然认为这是库存的函数,而不是项目(超过一个item.stackable成员),所以我会有一个处理对象集合的Inventory类,是一个人、一个箱子或一个商店的内容。一个简单的实现就是一个包装器

inventory = [(HealthPotion(), 2)]

其中任何相同的项目表示为一对项目和金额

或者,如果您有一个stacks_with方法,那么将前者转换为后者非常容易:

def stack_size(item, inv):
    "The number of items that will stack with item in inv"
    return len([i for i in inv if item.stacks_with(i)])

def stacked_inventory(inv):
    # if there is no stackable pair in the first i items
    # (i.e. the stack size for that item is 0 in inv[0:i]),
    # then the 'i'th item is a new stack,
    # with stack_size(inv[i], inv) items in it
    stacks = [ (inv[i], stack_size(inv[i]))
                  for i in range(0,len(inv)) 
                  if not stack_size(inv[i], inv[0:i])]
    return stacks

我认为您可能对类和实例的工作方式有点误解。如果你考虑的是人,这可能更有意义。

假设我们想在我们的类层次结构中建模人。现在,一个人必须有一个名字,如果你让他们说话,他们会说他们的名字:

class Person(object):
    def __init__(self, name):
        self.name = name

    def speak(self):
        print "Hi! My name is {self.name}.".format(self=self)

那么Person的一个实例就是一个人!例如:

>>> basil = Person("Basil")
>>> polly = Person("Polly")
>>> 
>>> basil.speak()
Hi! My name is Basil.
>>> polly.speak()
Hi! My name is Polly.
>>> basil == polly
False

因此,一个实例不是一个类的人——它实际上只是一个人。

我听到你问,难道你不能有一个实例本身就是类的类吗?是的,你当然可以!它被称为元类,在某些情况下是一个非常强大的工具。但是,不是这些。


现在,如果你看看你的情况,你看到区别了吗?HealthPotion不是一种特殊的药水(比如说,我口袋里的这个药水)——它是一种类型的药水。我们表达这种关系的方式是通过类继承:定义一个继承自Potion的新类HealthPotion。你可以有这样的例子(在我的口袋里,在商店里,在任何地方)。如果你想使用药水,你可以使用一个特定的类实例。

相关问题 更多 >

    热门问题