2024-10-06 11:23:11 发布
网友
我知道这是个奇怪的主意。想法应该是这样的:
class AnyClass: def __init__(self): # print object name
然后创建一个新对象
最后得到这个输出:
'test'
这不是背后的想法,但这是一个简单的例子,我试图。。。在
PS:我不想获取类名,只想获取对象名(如果可能) PS2:我知道我可以用test.__name__来获取名称,但我试图在类内部而不是外部获取名称。在
test.__name__
考虑一下这个:
>>> a = dict() >>> b = a
a和{}引用了完全相同的对象。在
a
当您对一个对象执行.操作时,您正在查找该对象的属性。一个对象可以在许多不同的位置被引用;它存储所有这些引用名称是没有意义的,特别是当这些名称只在特定上下文中绑定时。例如
.
def generator(): a = dict() yield a b = next(generator())
a和b都引用同一个dict对象,但是除了生成器函数之外,不能使用a引用{}。在
b
dict
如果你能在一个特定的测试中看到一个特定的名字。在
test = MyObject() for name, obj in locals().items(): if test is obj: print name
第一:你不想这样做,没有理由这么做,如果你认为你需要这样做,你就错了。在
第二:不能在__init__方法中执行此操作,因为引用新的AnyClass实例对象的名称引用test尚未添加到内存空间(“绑定”)。不过,你可以这样做。在
__init__
AnyClass
test
class AnyClass(): def echo_name(self): {v:k for k,v in locals().items()}[self] test = AnyClass() test.echo_name()
这将返回在分配给locals()对象的locals()字典中遇到的第一个变量。无法保证这些变量的返回顺序。在
locals()
要进一步解释为什么它在__init__方法中不起作用,请执行以下操作:
根据类定义(包括任何父类或元类的定义)的指令构造AnyClass的新实例。这种构造分阶段进行,最后一个阶段是执行__init__方法。在__init__之前,将要执行的其他方法是__new__,以及元类的__new__、__init__和{}方法(如果存在的话)。在
__new__
所以在执行__init__方法体中的代码时,对象仍在构造中。因此,到目前为止,locals()字典中没有为名称'test'赋值。只有一个名为'self'的成员。而且,显然,如果您反向查找locals()字典中的self对象来查找注册名称,那么您将得到的名称是'self'。哪个。。。没用。在
'self'
self
考虑一下这个:
}引用了完全相同的对象。在
^{pr2}$a
和{当您对一个对象执行
.
操作时,您正在查找该对象的属性。一个对象可以在许多不同的位置被引用;它存储所有这些引用名称是没有意义的,特别是当这些名称只在特定上下文中绑定时。例如a
和b
都引用同一个dict
对象,但是除了生成器函数之外,不能使用a
引用{如果你能在一个特定的测试中看到一个特定的名字。在
第一:你不想这样做,没有理由这么做,如果你认为你需要这样做,你就错了。在
第二:不能在
__init__
方法中执行此操作,因为引用新的AnyClass
实例对象的名称引用test
尚未添加到内存空间(“绑定”)。不过,你可以这样做。在这将返回在分配给
locals()
对象的locals()
字典中遇到的第一个变量。无法保证这些变量的返回顺序。在要进一步解释为什么它在
^{pr2}$__init__
方法中不起作用,请执行以下操作:根据类定义(包括任何父类或元类的定义)的指令构造}方法(如果存在的话)。在
AnyClass
的新实例。这种构造分阶段进行,最后一个阶段是执行__init__
方法。在__init__
之前,将要执行的其他方法是__new__
,以及元类的__new__
、__init__
和{所以在执行
__init__
方法体中的代码时,对象仍在构造中。因此,到目前为止,locals()
字典中没有为名称'test'
赋值。只有一个名为'self'
的成员。而且,显然,如果您反向查找locals()
字典中的self
对象来查找注册名称,那么您将得到的名称是'self'
。哪个。。。没用。在相关问题 更多 >
编程相关推荐