Python:如何引用实例名?
我正在使用以下代码收集实例:Python:如何引用实例名?,python,class,instance,Python,Class,Instance,我正在使用以下代码收集实例: class Hand(): instances = [] def __init__(self): Hand.instances.append(self) self.value = 5 def do_something(self, a): self.value = self.value * a class Foo(): def __init__(self): pass
class Hand():
instances = []
def __init__(self):
Hand.instances.append(self)
self.value = 5
def do_something(self, a):
self.value = self.value * a
class Foo():
def __init__(self):
pass
def insty(self):
self.hand1 = Hand()
self.hand2 = Hand()
foo = Foo()
foo.insty()
print Hand.instances
for hand in Hand.instances:
print "how do I print the instance name?"
最后一行只是学习如何访问实例名的一种方法,这样我就可以按顺序对每个实例调用“do_something”方法
如何访问每个Hand实例的实例名?
foo=foo()
意味着变量foo
只指向由foo()
返回的对象,这里没有名称的概念。foo.\uu dict\uu
将具有“hand1
”和“hand2
”键(以及其他键)。但你可能走错了方向。如果名称很重要,则应将其用作Foo
(或其他地方)中的显式索引
e、 g
如果您指的是如何从分配给
self.hand1
的实例中获取hand1
,那么答案是您不能。当您执行self.hand1=Hand()
时,您会告诉Foo对象它有一只手,但该手对象不知道它已被分配给Foo。您可以这样做:
h = Hand()
self.bob = h
self.larry = h
那只手的“名字”应该是什么?你给“鲍勃”和“拉里”分配了同一只手,所以它不可能有一个唯一的名字
如果你想为每只手取一个名字,你需要告诉那只手你想给它取什么名字。您必须修改手代码,以便将名称传递给构造函数,然后使用Hand(“某些名称”)
创建手
当然,您可以通过在手上指定属性来为手命名:
self.hand1 = Hand()
self.hand1.name = "hand 1"
。但这些名字并不是特别的或“自动”的
底线是,如果你想让某个东西有一个名字,你需要决定如何处理这个名字。您需要编写自己的代码来命名它,并编写自己的代码来检索它的名称。我不知道这是否能解决您的问题。我需要获取实例名称,以便进行清晰的错误报告。我到处看,人们都说“变量没有名称!名称只是指向对象的指针!” 但事实证明,用python获取实例名非常简单。 我是这样做的:
import gc
def instance_names(self):
referrers = gc.get_referrers(self)
result = []
dict_of_things = {}
for item in referrers:
if isinstance(item, dict):
dict_of_things = item
for k, v in dict_of_things.items():
if v == self:
result.append(k)
if not result:
result = ['unnamed instance']
return result
“实例名”是什么意思?你认为每个实例的“名称”是什么?我指的是“hand1”和“hand2”。。。也许是错误的。我是个新手。。。温柔点!hand-in-hand.instances:hand.do_something()?@dwstein-instance-name只是一个指向对象的变量,例如,如果你有,
foo=foo()
,然后foo1=foo
,那么foo
和foo1
都指向foo()
,那么你将如何命名这个实例呢?所以前几天我遇到了这个人。。。为什么我仅仅通过看他就不能确定他的名字?你说人们有时有不止一个名字是什么意思?谢谢!如果我动态创建实例,这是否有效?i、 e.我不知道创建了多少实例,是的,但您应该尝试阅读有关该类型的更多信息。您应该忘记\uuu dict\uu
存在。这是一个实现细节,并不意味着要被戳破。的确,但它很可能是OP最初问题的少数几个答案之一。嗨!谢谢你的回复。然而,链接往往会随着时间的推移而中断。您是否也可以添加代码的相关部分?谢谢。@imzcig,修好了!
import gc
def instance_names(self):
referrers = gc.get_referrers(self)
result = []
dict_of_things = {}
for item in referrers:
if isinstance(item, dict):
dict_of_things = item
for k, v in dict_of_things.items():
if v == self:
result.append(k)
if not result:
result = ['unnamed instance']
return result