Pregunta

Estoy haciendo algo como esto:

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

¿Cómo hago que el método __ init __ de mi instancia use la cadena de nombre de instancia para 'c'? Diga en caso de que:

c=Class()

Quiero c.var igual a 'c'.

Gracias por sus respuestas, estoy implementando persistencia y Class es la clase de objeto persistente. Quiero que __ init __ agregue una entrada a la base de datos cuando:

del c

Entonces, supongamos:

<*>

Más adelante:

<*>

debe crear una instancia utilizando datos de la base de datos si ya hay una entrada 'c'; de lo contrario, cree una nueva entrada.


Gracias por sus respuestas, estoy implementando persistencia y Class es la clase de objeto persistente. Quiero que __ init __ agregue una entrada a la base de datos cuando:

<*>

Entonces, supongamos:

<*>

Más adelante:

<*>

debe crear una instancia utilizando datos de la base de datos si ya hay una entrada 'c'; de lo contrario, cree una nueva entrada.

¿Fue útil?

Solución

Para conservar los objetos de datos, debe usar la ID única del registro de la base de datos.

pesudo código porque no sé qué módulo de base de datos está usando

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)))

Nuevamente, este es un pseudocódigo, la técnica de inyección de cadenas que estoy usando NO se recomienda porque es bastante insegura, solo está ahí para ilustrar cómo persistir usando clases con un db.

Otros consejos

Python no tiene variables, tiene objetos y nombres . Cuando lo hagas

c = Class()

estás haciendo dos cosas:

  1. Crear un nuevo objeto de tipo Class
  2. Enlace del objeto al nombre c en el ámbito actual.

El objeto que creó no tiene ningún concepto de " nombre de variable " - Si luego lo haces

a = c

entonces se puede acceder al mismo objeto exactamente de la misma manera usando los nombres a y c . Puede eliminar el nombre a , y el objeto seguirá existiendo.

Si los objetos que crea necesitan tener un nombre, la mejor manera es pasárselos explícitamente ,

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

var = Class('var')

No puedes hacer esto. La razón de esto es que el objeto de la clase se crea primero, y solo después este objeto está vinculado al nombre de la instancia.

No puedes (salvo trucos increíbles como examinar el marco de la pila e inspeccionar el código de bytes). Puede que ni siquiera haya un nombre, o podría haber varios de esos nombres. Lo que se debe dar para los siguientes fragmentos de código, por ejemplo:

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

No creo que esto sea posible porque la asignación a la variable de su nueva instancia ocurre después de que el objeto está completamente construido e inicializado, por lo que no sabe el nombre de la variable a la que se asignará dentro de Método de inicio

No conozco una forma de acceder al nombre de una variable mediante programación sin utilizar una reflexión profunda y un depurador. No creo que la información esté disponible en tiempo de ejecución.

Si desea dar a las instancias un nombre (¿único?), probablemente debería hacer que el inicializador acepte un argumento adicional.

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

Y la persona que llama debe pasar el nombre apropiado:

c = Class("c")

Este es un problema de alcance, no puede hacer lo que está pidiendo. Debido a que c se declararía fuera del alcance de su clase, su instancia no tiene conocimiento de lo que se ha nombrado en el código.

Quizás si puede proporcionar una explicación más amplia de lo que está tratando de lograr, se puede sugerir una mejor solución.

Eso no es posible. Parece que estás confundiendo variables y objetos.

En cualquier caso, puede que no haya una variable:

por ejemplo

foo(Class())

Class().arbitraryMethod()

O múltiple:

a = b = Class()

Tengo el mismo pensamiento hace varios años. Esta es una característica interesante, pero el creador del lenguaje no la proporciona. Y pensé que todos son tontos por no descubrir esta gran característica.

Pero luego piensa en eso. Creo que la lógica es imposible. decir:

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

var = Class()

ahora si la var es una matriz, ¿eso es posible también?

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

eso es lo que pienso, no creo que sea posible asignar la instancia en sí misma. y en algún idioma acabo de enviar la cadena de instancia al objeto y luego usar eval para ejecutar la función

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top