【发布时间】:2013-02-02 22:50:54
【问题描述】:
我希望能够做到以下几点:
class PrintName:
def __init__( self, obj ):
print obj._name
class SetName:
def __init__( self, name = None ): # Default name is None
self._name = name
class Test:
f = SetName( ) # No explicit name given
g = PrintName( f )
此时我希望 python 打印 'f',所以在执行 PrintName(f) 时 f 应该知道它的名称。
我发现的每个自动命名解决方案都在创建后为属性命名。 我一直在尝试使用元类来解决这个问题,但即使这样似乎也不起作用。
我想这样做是为了能够“保存”和“重新加载”python 代码以供以后使用(有点像原始脚本语言,可以在使用时评估的程序中更改)
例如:
x = 0
y = 0
p = ( x, y )
打印 p 得到 (0,0),然后用 x 和 y 做一些事情,得到
x = 124
y = -32
p = ( x, y )
打印 p 变为 (124,-32)。
最简单的方法是使用
p = ( 'x', 'y' )
但是在这种情况下,我们怎么知道'x'是变量名而不是字符串'x'
我已经尝试为此目的编写一种简单的脚本语言,但工作量很大,如果上述方法可行,那么整个 python 语言都可以在脚本中使用。
我正在尝试为我的问题找到一个简单而灵活的解决方案。
提前感谢您的帮助。
【问题讨论】:
-
此时我希望 python 打印 'f' - 这不正是它的作用吗?你到底想在这里做什么?你所有的代码示例都按照你说的去做
-
一个Python对象可以有多个名字,它怎么知道你想要哪个?
-
x = MyClass(); y = x; print nameOf(y)- 那应该怎么做? -
更好的是,许多对象可能根本没有名字。考虑在评估
[1] + [2] + [3]期间创建的中间列表[1,2](每个列表和中间列表都是从VM 内部引用的,而不是通过任何Python 名称引用的)。注意你所追求的效果是在一种叫做反应式编程的范式中找到的,众所周知,它很难改造成命令式编程语言——如果你想以任何类似于“好”的方式做到这一点,你就必须做好准备并自己实施很多。 -
0) 将原始示例更改为我想要的。 1) 如果是:x = MyClass(); y = x;这应该创建一个具有不同名称的新对象。一个带有“x”,一个带有“y” 2) 匿名对象应该有一个生成的唯一名称。 (示例:MyClass000)
标签: python serialization metaclass