当__str__覆盖时,获取python中对象实例的名称?

时间:2018-02-25 16:49:27

标签: python class

我正在创建一个简单的容器系统,其中我的对象(名为GeneralWidget的类的所有子级)被分组在一些容器中,这些容器位于另一组容器中,依此类推,直到所有容器都在一个全球容器。 我有一个名为GeneralContainer的自定义类,其中我必须覆盖__str__方法以为我的容器提供描述名称,因此我知道在他内部存储了什么类型的对象或容器。

我目前正在编写另一个名为ObjectTracker的类,其中存储了对象的所有位置,因此在创建新对象时,它会在__init__中为其提供一个名称为“{1}}的列表在我的hieracy中它的“父”的方法,它将自己添加到列表并传递给它。在某个时刻,此列表包含位于新创建的GeneralWidget实例之上的所有对象,将到达全局GeneralWidget(包含所有容器和小部件),可以访问ObjectTracker - 对象中的main()对象。我的ObjectTracker

这是我的问题的背景。我的ObjectRepository有一个字典,其中每个“第一级容器”都是一个键,这样一个容器内的所有对象也存储在字典中。所以我有 许多封装的词典。

由于我不知道会有多少级别的容器,我需要一个动态语法,它与我需要传递给unil的dictionarys的数量无关。我到达了我想要的BIG词典中的位置。我的self._OBJECTREPOSITORY[firstlevelcontainer12][secondlevel8][lastlevel4] = myNewObject 类中的(静态)调用需要看起来像这样:

firstlevelcontainer12

secondlevel8包含lastlevel4,其中包含exec(),其中应放置新对象

但我既不知道容器的调用方式,也不知道容器的数量,所以我决定使用ObjectTracker并组成一个包含所有名称的字符串。我将在此处发布我的实际代码,即class ObjectTracker: def __init__(self): self._NAMEREPOSITORY = {} def addItem(self, pathAsList): usableList = list(reversed(pathAsList)) string = "self._NAMEREPOSITORY" for thing in usableList: if usableList[-1] != [thing]: string += "[" + str(thing) + "]" else: string += "] = " + str(thing) print(string) exec(string)

的定义
__str__

问题在于我已经覆盖了类GeneralContainer的{​​{1}}方法和GeneralWidget来重新描述一个描述名称。这在许多场合非常方便,但现在它已经成为一个大问题。上面的代码只有在自定义名称与对象实例的名称相同时才有效(当然,我明白了!)

问题是:是否存在内置函数来执行以下操作:

>>> alis = ExampoleClass()
>>> DOESTHISEXIST(alis)
'alis'

如果不是,如何在不破坏我的良好工作命名系统的情况下编写自定义文件?

2 个答案:

答案 0 :(得分:1)

注意:由于我不确定您的需求,我将尝试提供一般解决方案。

首先,避免像黑瘟一样/** * Parse URL * * This method is meant to transform the human readable URL back into * query parameters. It is only executed when SEF mode is switched on. * * @param array &$segments The segments of the URL to parse. * * @return array The URL attributes to be used by the application. */ public function parse(&$segments) { while (!empty($segments)) { $segment = array_pop($segments); if (is_numeric($segment)) { // It's the ID $vars['id_tsi'] = (int) $segment; } else { // It's the view $vars['view'] = $segment; } } return $vars; } There are serious problems one encounters when using them 几乎总是更好的方式。这是我在下面提出的方式:

您似乎想要一种方法来找到某个嵌套字典,并给出特定键的列表。这可以使用for循环非常容易地完成并递归遍历所述字典。例如:

eval/exec

如果您需要分配某个嵌套字典的特定部分,也可以使用上面的代码完成:

>>> def get_value(dictionary, keys):
        value = dictionary
        for key in keys:
            value = value[key]
        return value

>>> d = {'a': 1, 'b': {'c': 2, 'd': 3, 'e': {'f': 4, }, 'g': 5}}
>>> get_value(d, ('b', 'e', 'f'))
4
>>> 

以下是上述函数的正式版本,包含错误测试和文档(以自定义样式):

>>> dd = get_value(d, ('b', 'e')) # grab a dictionary object
>>> dd
{'f': 4}
>>> dd['h'] = 6
>>> # the d dictionary is changed.
>>> d
{'a': 1, 'b': {'c': 2, 'd': 3, 'e': {'f': 4, 'h': 6}, 'g': 5}}
>>> 

答案 1 :(得分:0)

我想你可能正在寻找vars()

a = 5
# prints the value of a
print(vars()['a'])
# prints all the currently defined variables
print(vars())
# this will throw an error since b is not defined
print(vars()['b'])