4

我正在做这样的事情:

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

如何使我的实例的 __ init __ 方法将实例名称字符串用于“c”?以防万一说:

c=Class()

我希望 c.var 等于'c'。

感谢您的回复,我正在实现持久性,而 Class 是持久性对象的类。我希望 __ init __ 在以下情况下向数据库添加一个条目:

c=Class()

那么,假设:

del c

稍后的:

c=Class()

如果已经有条目“c”,则应使用数据库中的数据创建一个实例,否则创建新条目。


感谢您的回复,我正在实现持久性,而 Class 是持久性对象的类。我希望 __ init __ 在以下情况下向数据库添加一个条目:

c=Class()

那么,假设:

del c

稍后的:

c=Class()

如果已经有条目“c”,则应使用数据库中的数据创建一个实例,否则创建新条目。

4

9 回答 9

7

Python 没有变量,它有对象和名称。当你这样做

c = Class()

你正在做两件事:

  1. 创建类型的新对象Class
  2. 将对象绑定到c当前范围内的名称。

您创建的对象没有任何“变量名”的概念 - 如果稍后您这样做

a = c

a那么同一个对象可以使用名称和以完全相同的方式访问c。您可以删除 name a,并且该对象仍然存在。

如果您创建的对象需要有一个名称,最好的方法是显式地将它传递给它们,

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

var = Class('var')
于 2009-01-14T17:13:51.607 回答
3

你不能这样做。这样做的原因是首先创建了类的对象,然后才将该对象绑定到实例的名称。

于 2009-01-14T17:07:24.473 回答
2

您不能(缺少令人难以置信的技巧,例如检查堆栈帧和检查字节码)。甚至可能没有名字,或者可能有多个这样的名字。例如,以下代码片段应该给出什么:

l = [Class(), Class()]
a=b=c=d=Class()
于 2009-01-14T17:05:28.533 回答
2

我认为这是不可能的,因为在对象完全构造和初始化之后发生对新实例变量的分配,因此您不知道它将在init方法中分配的变量名称

于 2009-01-14T17:06:06.300 回答
1

我不知道在不使用深度反射和调试器的情况下以编程方式访问变量名称的方法。我认为这些信息在运行时不可用。

如果你想给实例一个(唯一的?)名字,你应该让初始化器接受一个额外的参数。

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

调用者应传入适当的名称:

c = Class("c")
于 2009-01-14T17:05:25.897 回答
1

这是一个范围问题,你不能做你所要求的。因为 c 将在您的类范围之外声明,您的实例不知道它在代码中的名称。

如果您可以提供更广泛的解释来说明您正在尝试完成的工作,也许可以建议您提出更好的解决方案。

于 2009-01-14T17:07:36.097 回答
1

要持久化数据对象,您需要使用数据库记录的唯一 ID。

伪代码,因为我不知道您使用的是什么数据库模块

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

同样,这是伪代码,不建议我使用我使用的字符串注入技术,因为它相当不安全,它只是为了说明如何使用带有 db 的类进行持久化。

于 2009-01-14T20:55:08.773 回答
0

那是不可能的。您似乎混淆了变量和对象。

无论如何,很可能没有变量:

例如

foo(Class())

Class().arbitraryMethod()

或多个:

a = b = Class()
于 2009-01-14T17:04:52.170 回答
0

几年前我也有同样的想法。这是某种简洁的功能,但语言创建者没有提供它。而且我认为他们都是傻瓜,没有发现这个伟大的功能。

但后来想想。我认为逻辑是不可能的。说:

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

var = Class()

现在如果 var 是一个数组,那也可能吗?

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

这就是我的想法,我认为将实例分配给自身是不可能的。在某种语言中,我只是将实例字符串发送到对象中,然后使用 eval 执行函数

于 2010-01-29T07:25:39.447 回答