Question

Je fais quelque chose comme ça:

class Class(object):
    def __init__(self):
        self.var=#new instance name string#   

Comment faire en sorte que la méthode __ init __ de mon instance utilise la chaîne de nom d'instance pour 'c'? Dites au cas où:

c=Class()

Je veux que c.var soit égal à 'c'.

Merci pour vos réponses. J'implémente la persistance et Class est la classe de l'objet persistant. Je souhaite que __ init __ ajoute une entrée à la base de données lorsque:

del c

Ensuite, supposons:

<*>

Plus tard:

<*>

sholuld doit créer une instance à l'aide des données de la base de données s'il existe déjà une entrée 'c', sinon créer une nouvelle entrée.

Merci pour vos réponses. J'implémente la persistance et Class est la classe de l'objet persistant. Je souhaite que __ init __ ajoute une entrée à la base de données lorsque:

<*>

Ensuite, supposons:

<*>

Plus tard:

<*>

sholuld doit créer une instance à l'aide des données de la base de données s'il existe déjà une entrée 'c', sinon créer une nouvelle entrée.

Était-ce utile?

La solution

Pour conserver les objets de données, vous devez utiliser l'ID unique de l'enregistrement de la base de données.

Code pesudo car je ne sais pas quel module de base de données vous utilisez

import db # assume this is your db module

class Class(object):
    def __init__(self):
        self.id = None
        self.name = None

    def get_by_id(self, id):
        records = db.execute('select * from table where id=%s' % str(id))
        if records:
            self.id = records[0]['id']
            self.name = records[0]['name']

    def save(self):
        db.execute('update table set name=%s where id=%s' % (self.name, str(self.id)))

Encore une fois, c’est du pseudo-code, la technique d’injection de chaînes que j’utilise n’est PAS conseillée, car elle est assez peu sûre, c’est juste là pour illustrer comment persister à l’aide de classes avec une base de données.

Autres conseils

Python n'a pas de variable, il contient des objets et des noms . Quand vous faites

c = Class()

vous faites deux choses:

  1. Création d'un nouvel objet de type Class
  2. Liaison de l'objet au nom c dans la portée actuelle.

L'objet que vous avez créé n'a aucun concept de "nom de variable". - Si plus tard vous le faites

a = c

alors le même objet est accessible exactement de la même manière en utilisant les noms a et c . Vous pouvez supprimer le nom a et l'objet existera toujours.

Si les objets que vous créez doivent avoir un nom, le meilleur moyen est de le leur transmettre. explicitement ,

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

var = Class('var')

Vous ne pouvez pas faire ça. La raison en est que l’objet de la classe est créé en premier et que cet objet est ensuite lié au nom de l’instance.

Vous ne pouvez pas (à moins de manipulations incroyables comme examiner le cadre de la pile et inspecter le code intermédiaire). Il se peut qu’il n’existe même pas un nom ou qu’il en existe plusieurs. Ce qui devrait être donné pour les fragments de code suivants par exemple:

l = [Class(), Class()]
a=b=c=d=Class()

Je ne pense pas que cela soit possible car l'affectation à la variable de votre nouvelle instance se produit une fois que l'objet est entièrement construit et initialisé et vous ne connaissez donc pas le nom de la variable à laquelle elle sera affectée dans . méthode init

Je ne suis pas au courant d'un moyen d'accéder au nom d'une variable par programme sans utiliser une réflexion en profondeur et un débogueur. Je ne pense pas que les informations soient disponibles au moment de l'exécution.

Si vous souhaitez attribuer un nom (unique?) aux instances, vous devez probablement faire en sorte que l'initialiseur accepte un argument supplémentaire.

def __init__(self, name):
    self.name = name

Et l'appelant doit indiquer le nom approprié:

c = Class("c")

Ceci est un problème de portée, vous ne pouvez pas faire ce que vous demandez. Parce que c serait déclaré en dehors de la portée de votre classe, votre instance ignore ce qu’elle a été nommée dans le code.

Peut-être pourriez-vous suggérer une explication plus large de ce que vous essayez de faire pour améliorer la solution.

Ce n'est pas possible. Vous semblez confondre variables et objets.

Dans tous les cas, il peut ne pas y avoir de variable:

par exemple

foo(Class())

Class().arbitraryMethod()

Ou multiple:

a = b = Class()

J'ai la même pensée il y a plusieurs années. C'est une sorte de fonctionnalité intéressante, mais le créateur de la langue ne la fournit pas. Et j’ai pensé qu’ils étaient tous fous de ne pas découvrir cette fonctionnalité intéressante.

Mais ensuite, réfléchissez-y. Je pense que la logique est impossible. dire:

class Class(object):
    def __init__(self):
        self.instance_name.move() # self.instance_name refer to var
    def move(self):
        print "move"

var = Class()

maintenant si la var est un tableau, est-ce possible aussi?

var[0] = Class() # i think it will get confused a bit

c'est ce que je pense, je ne pense pas qu'il soit possible d'assigner l'instance en elle-même. et dans une langue que je viens d'envoyer la chaîne d'instance dans l'objet, puis en utilisant eval pour exécuter la fonction

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top