Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的_init__(self)中的寻址实例名称字符串_Python_Instance_Instantiation - Fatal编程技术网

Python中的_init__(self)中的寻址实例名称字符串

Python中的_init__(self)中的寻址实例名称字符串,python,instance,instantiation,Python,Instance,Instantiation,我正在做这样的事情: class Class(object): def __init__(self): self.var=#new instance name string# 如何使我的实例的_uuu _uuu uuuu方法使用“c”的实例名称字符串?在下列情况下说: c=Class() 我想要c.var等于'c' 谢谢你们的回复,我正在实现持久性,类是持久性对象的类。在以下情况下,我希望_u; init _;向数据库添加一个条目: c=Class() c=C

我正在做这样的事情:

class Class(object):
    def __init__(self):
        self.var=#new instance name string#   
如何使我的实例的_uuu _uuu uuuu方法使用“c”的实例名称字符串?在下列情况下说:

c=Class()
我想要c.var等于'c'

谢谢你们的回复,我正在实现持久性,类是持久性对象的类。在以下情况下,我希望_u; init _;向数据库添加一个条目:

c=Class()
c=Class()
那么,假设:

del c
del c
稍后:

c=Class()
c=Class()
如果已经存在条目“c”,则sholuld使用数据库中的数据创建实例,否则创建新条目


谢谢你们的回复,我正在实现持久性,类是持久性对象的类。在以下情况下,我希望_u; init _;向数据库添加一个条目:

c=Class()
c=Class()
那么,假设:

del c
del c
稍后:

c=Class()
c=Class()

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

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

在任何情况下,都可能没有变量:

e、 g

或多个:

a = b = Class()

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

如果您想给实例一个(唯一的?)名称,您可能应该让初始值设定项接受一个额外的参数

def __init__(self, name):
    self.name = name
并且调用者应输入适当的名称:

c = Class("c")
你不能(缺少像检查堆栈帧和字节码这样不可思议的黑客)。甚至可能没有名字,或者可能有多个这样的名字。例如,应为以下代码片段提供什么:

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

我认为这是不可能的,因为对新实例occours的变量的赋值是在对象完全构造和初始化之后进行的,因此您不知道它将在init方法中被赋值给的变量名。您不能这样做。这是因为类的对象是先创建的,然后才将该对象绑定到实例的名称。

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


如果你能对你想要完成的事情提供一个更广泛的解释,也许可以建议一个更好的解决方案。

Python没有变量,它有。当你这样做的时候

c = Class()
你在做两件事:

  • 创建类型为
    Class
  • 将对象绑定到当前范围中的名称
    c
  • 您创建的对象没有任何“变量名”的概念——如果以后有

    a = c
    
    然后使用名称
    a
    c
    以完全相同的方式访问同一对象。您可以删除名称
    a
    ,对象仍然存在

    如果创建的对象需要有名称,最好的方法是将其传递给它们


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

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

    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类。

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

    但是现在来考虑一下。我认为这个逻辑是不可能的。说:

    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执行函数

    以重新迭代,aduck.var=aduck?