Python 分配变量时为对象分配变量名

Python 分配变量时为对象分配变量名,python,Python,在python中,变量有名称,而对象没有名称,因为多个变量可以指向同一个对象 但是,当对象分配给变量时,是否有方法添加/修改对象的name属性 理想情况下,工作原理如下: spam = MagicObject() print(spam.name) # output: "spam" ham = spam print(spam.name) # output: "ham" 编辑:事实上,我并不介意第二次打印是火腿还是垃圾邮件,因为我并不打算让几个变量指向同一个对象。我只想让对象有一个名字,不管在什么

在python中,变量有名称,而对象没有名称,因为多个变量可以指向同一个对象

但是,当对象分配给变量时,是否有方法添加/修改对象的name属性

理想情况下,工作原理如下:

spam = MagicObject()
print(spam.name) # output: "spam"
ham = spam
print(spam.name) # output: "ham"
编辑:事实上,我并不介意第二次打印是火腿还是垃圾邮件,因为我并不打算让几个变量指向同一个对象。我只想让对象有一个名字,不管在什么情况下

我的想法是用尽可能少的文字创建某种参数文件。所以这个简单的代码:

person_id = PrimaryKey()

将创建一个PrimaryKey对象并自动将其命名为person_id

,我认为这是您所能实现的最接近您正在尝试做的事情。它效率低下,并且滥用globals和properties。此外,如果MagicObject很复杂,它将需要实现uuu eq uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

这是一种黑客行为,可能不应该在生产中使用

 class MagicObject:
    @property
    def name(self):
        return [k for k, v in globals().items() if v == self]

a = MagicObject()
print(a.name)
b = a
print(a.name)
c = a
print(a.name)
del b
print(a.name)
输出

['a']
['a', 'b']
['a', 'b', 'c']
['a', 'c']

还要记住,在Python<3.7中,列表的顺序是任意的,因为字典没有顺序。

看起来您想要编写ORM。两项建议:

不要。例如,使用一个已经编写好的SQLAlchemy。 如果您正在做其他事情,或者您真的想进入兔子洞,请检查这些ORMs是如何做到的,最有可能是使用元类。
没有。垃圾邮件实际上无法知道它已分配给任何对象,更不用说知道受让人的身份了name@PhxDev与OP试图做的事情完全无关。所以,如果我们做a,b=垃圾邮件,垃圾邮件,你期望会发生什么?变量只是算法中的占位符。它们的特定名称应该没有任何意义,特别是因为您有时会被限制在可以用于给定变量的名称中,因此无法赋予它任何特定的含义。这可以通过类属性实现,例如class Foo:bar=Baz,然后是很多元类或_init __; magic…但对于独立变量,这是一个坏主意。这当然是不够的,但我看不出有任何滥用。Globals和property对我来说是完全有效的工具。您可以使其成为一个非任意列表,返回排序为[k代表k,如果v==self,则在globals.items中为v]。无论如何,我并不打算为一个对象设置多个变量。我只是想澄清一下,不管发生什么情况,如果对象的名称是任意的,那么它可以是唯一的。我认为应该用v is self替换v==self。不需要这样重新定义“eq”,它更符合逻辑anyway@Madlozoz不一定,这完全取决于MagicObject的实现,以及我在回答中解释的您试图实现的目标。如果未定义uuu eq uuuuu,==仍将返回到is