1

无论如何要确定实例最初绑定到的变量吗?

通过一个函数,我们可以做到这一点:

def f():
    pass
print f.__name__
>> f
g = f
print g.__name__
>> f

我想要的是:

class c:
    pass

mything = c()
print mything.__name__
>> mything

我想要这个的原因是为我正在编写的 API 提供更直观的日志记录/错误消息。

print mything
>> instance of c originally bound to 'mything'

而不是通常的:

print mything
>> <__main__.c instance at 0x7fb7994b25a8>

__name__而且(我认为?)不要让人们一直明确地提供一个属性会很好__init__

这可能吗?可取的?

4

3 回答 3

2

例如,您想要这样的东西(函数示例让我感到困惑):

class Foo(object):
    # something here
    pass

a = Foo()
b = Foo()
c = Foo()

print a.__name # a
print b.__name # b
print c.__name # c

? 如果是这样,那是不可能的。该信息不能在实例中携带。许多 Instance 可以指向同一个实例,如下所示:

>>> class Foo(object):
...     pass
...
>>>
>>> a = Foo()
>>> b = a
>>> c = b
>>>
>>> print a
<__main__.Foo object at 0x01765B70>
>>> print b
<__main__.Foo object at 0x01765B70>
>>> print c
<__main__.Foo object at 0x01765B70>
>>>

它们都一样,携带哪个实例名称,重点是什么?另一个问题在这里:

class Foo(object):
    pass

a = [Foo(), Foo(), Foo()]

我能想到的唯一可能的解决方案是在初始化时标记实例:

>>> class Foo(object):
...     def __init__(self, name):
...         self.__name__ = name
...
>>> a = Foo('a')
>>> b = Foo('b')
>>> c = Foo('c')
>>>
>>> a.__name__
'a'
>>> b.__name__
'b'
>>> c.__name__
'c'
>>>
于 2013-09-03T23:42:34.750 回答
1

没有办法,如果有办法,它不会像你想象的那么有用。当你定义一个函数时,你给它一个名字,大多数对函数的引用都会使用这个名字。另一方面,其他对象往往不会与单个名称紧密联系。

def factory_function(parameter):
    obj = Thing(parameter)
    obj.preprocess_somehow()
    return obj

game_window = factory_function(parameter)
menu_screen = factory_function(parameter)
subscreens = [factory_function(parameter) for parameter in params]

这里最有趣的对象名称是game_windowmenu_screensubscreens,但“第一个变量”game_windowmenu_screen绑定到的对象要么是obj或者更早的东西,也许self是分配器函数中的某个 C 级变量。的项目subscreens甚至没有有用的个人名称。

于 2013-09-03T23:35:15.573 回答
0

为了后代的缘故,我发现这是一种骇人听闻的方式:

def find_global_var_name( target_obj ):
    for name, obj in globals().iteritems():
        if id(obj) == id(target_object):
            return name

假设一个全局定义的变量,这与我的用例一致,但我不会使用它,因为情绪似乎对整个事情都非常消极。

于 2013-09-03T23:52:16.733 回答