同一个 Python 对象中的实例变量怎么可能同时引用不同的对象呢?

How can an instance variable in the same Python object seemingly reference different objects at the same time?

我有两个参数列表 [{Parameter(arcpy.Parameter)}][{arcpy.Parameter}]。与基础 class arcpy.Parameter.

相比,subclass Parameter 包含额外的属性和功能

下面是调试控制台的输出。 param 在列表 1 中,param2 在列表 2 中。过滤器对象在基 class 中由 class 变量 filter 引用。对 param.filter 的更改也应该对 param2.filter 生效,反之亦然,因为它们应该引用相同的实例。

id(param)
86840096L
id(param2)
86840096L
id(param.filter)
62961424L
id(param2.filter)
62961368L

为什么虽然param ids相同,但filter ids却可以同时不同?这意味着什么?我可以阻止(或忽略)这个吗?

class Parameter(mixins.ParameterMixin,_BaseArcObject):
    filter = passthrough_attr('filter')
...

class Filter(_BaseArcObject):
    """The filter object allows you to specify the choices available for a
       parameter."""
    type = passthrough_attr('type')
    list = passthrough_attr('list')

def passthrough_attr(prop):
    "Basic attribute passthrough for a wrapped Arc object -- allows for early binding."
    def get_(self):
        "Geoprocessor %s property" % prop
        return getattr(self._arc_object, prop)
    def set_(self, val):
        return setattr(self._arc_object, prop, val)
    return property(get_, set_)

class _BaseArcObject(object):
    _arc_object = None
    def __init__(self, *args, **kwargs):
        """Wrapper for ArcGIS scripting Arc Objects --
           Create a new object instance if no reference is passed in."""
        super(_BaseArcObject, self).__init__()
        self._arc_object = gp._gp.CreateObject(self.__class__.__name__,
                    *((arg._arc_object if hasattr(arg, '_arc_object') else arg)
                        for arg in args))
...

大胆猜测,如果 filter 是一个方法,那么它们是在您每次访问函数 时动态创建的

>>> class A:
...    def foo(self):
...        pass
    
>>> type(A.foo)
function
>>> id(A.foo)
2528402192848
>>> id(A.foo)
2528402192848
>>> a = A()
>>> type(a.foo)
method
>>> id(a.foo)
2528397338368
>>> id(a.foo)
2528397337664

请注意,最后两个 ID 不同。