Python de créer plusieurs instances d'un même objet/classe
Je suis en utilisant Python. J'ai lu un peu à ce sujet et ne semble pas possible d'envelopper mon esprit autour de lui. Ce que je veux faire est d'avoir une classe appelée Potions diverses potion objets. Pour l'instant il y a une potion, un simple HealthPotion. Je veux des potions pour être empilable dans les stocks et une boutique de stocks. J'ai donc besoin d'une instance de la potion montant d'un inventaire et d'une instance pour chaque magasin de stock qui transporte des potions. La potion montant serait dynamique, pour l'achat/vente et le pillage des potions. Si quelqu'un pouvait fournir une explication de base ou des exemples, ce serait super.
Voici un extrait de ce que j'ai:
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)
Idéalement, la quantité par défaut devrait être fixé à 0 et je serais en mesure de déclarer à quel point une certaine boutique serait de commencer avec dans leur stock. L'inventaire et la boutique stock est défini comme un tableau que les éléments sont ajoutés et retirés. Je pense que j'ai la logique bas pour savoir comment ça allait fonctionner, je viens vais avoir des ennuis avec l'instanciation des montants.
EDIT: Cela fait partie de ce que j'ai dans une méthode acheter pour voir ce qui allait se passer sans l'aide des instances. C'est assez laid et j'ai discerné que vous.de l'inventaire.y.l'amt ne fonctionnera pas. y étant l'élément sélectionné de la liste des éléments qui s'affichent dans une "boutique."
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)
J'ai regardé les exemples de ce genre:
class foo:
a = 1
i = foo()
foo.a => 1
i.a => 1
i.a = "inst"
foo.a => 1
i.a => "inst"
Je me demande si je ne suis pas juste de créer un deuxième HealthPotion objet, mais qui n'est pas bonne pour moi. Cet exemple m'amène à penser le contraire. Peut-être que je ne comprends juste pas l'instanciation.
"Cela permettrait de créer de l'objet premier de la classe Employé"
emp1 = Employee("Zara", 2000)
"Cela permettrait de créer second objet de la classe Employee"
emp2 = Employee("Manni", 5000)
Merci!
Pas une solution à votre problème, mais il ne devrait pas être nécessaire pour vous de définir vos variables de membre dans la potion init si vous appelez votre super-classe init.
Vous voudrez probablement utiliser nommé mot-clé arguments au lieu d'un commentaire lors de la construction. (
health_potion = Potion(name="Health Potion", desc="Restores...", ...
)Ne demandez pas des exemples. Montrez-nous votre tentative de réalisation de la tâche, et de donner une description correcte de la tâche. Expliquer pourquoi votre tentative ne permet pas d'atteindre le résultat prévu. Mettre tout cela dans votre question, et non dans les commentaires.
Aussi, si l'une des réponses représente une résolution complète de votre problème, vous devez accepter le meilleur. Sinon, faites une mise à jour de votre question pour clarifier davantage.
OriginalL'auteur TechnoCat | 2012-02-27
Vous devez vous connecter pour publier un commentaire.
Je pense que vous pourrait être un peu égarés concept de la façon dont les classes et les instances de travail. Il pourrait faire plus de sens si vous pensez à des personnes à la place.
Supposons que nous voulons modèle de personnes dans notre hiérarchie de classe. Pour l'instant, une personne doit avoir un nom, et si vous leur demandez de parler ils disent leur nom:
Alors une instance de
Person
est, ainsi, une personne! Par exemple:Donc une instance n'est pas un genre de personne-il est vraiment juste une personne.
Pouvez-vous pas avoir une classe dont les instances sont eux-mêmes des classes, je vous entends demander? Oui, bien sûr, vous le pouvez! Il a appelé à une métaclasse et est un outil très puissant dans certaines circonstances. Pas, cependant, ces.
Maintenant, si vous regardez votre situation, vous voyez la différence? Un
HealthPotion
n'est pas un particulier potion (dire, ce un dans ma poche) -- c'est un genre de potion. Et la manière d'exprimer cette relation est par l'héritage de classe: définir une nouvelle classeHealthPotion
qui hérite dePotion
. Vous pouvez alors avoir des instances de ces (dans ma poche, dans un magasin, où). Si vous souhaitez utiliser une potion, vous utilisez un spécifiques un c'est à dire une instance de la classe.pas de problème, je serais heureux d'aider =) laissez-moi savoir si vous voulez un coup de main l'élaboration de la nouvelle structure d'héritage.
OriginalL'auteur Katriel
Le code que vous avez là l'utilise très déroutant conventions de nommage, qui, je pense, est de vous causer de la confusion --- HealthPotion n'est pas une classe, c'est un exemple, mais le CamelCase nom l'indique c'est une classe en python.
D'avoir plusieurs potions de santé à l'aide de votre potion de classe, il suffit de faire
Si c'est assez mauvais style, ce que vous voulez probablement, c'est d'avoir un moyen facile de créer de la santé et similaires potions, avec les mêmes propriétés et des potions avec des effets différents
Pour ce faire, vous devriez avoir
Si vous voulez avoir de multiples éléments d'un inventaire, il serait plus simple pour tout simplement avoir une liste (ou un ensemble) de votre inventaire et de plusieurs instances dans la liste, par exemple
Si vous voulez faire de l'empilement, je pense toujours que c'est une fonction de l'inventaire, en plus de l'élément (au-delà d'un
item.stackable
membre) je voudrais donc avoir unInventory
classe qui gère les collections de l'objet, que le contenu d'une personne, d'une commode ou d'une boutique. une mise en œuvre simple serait un wrapper autour deoù tout les éléments identiques sont représentés comme une paire de l'article et le montant
Sinon, il est assez facile de transformer l'ancien dans le dernier, si vous avez un
stacks_with
méthode:ajouté à comment je pourrais mettre en œuvre un inventaire
OriginalL'auteur tobyodavies