同一个 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 不同。
我有两个参数列表 [{Parameter(arcpy.Parameter)}]
和 [{arcpy.Parameter}]
。与基础 class arcpy.Parameter
.
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 不同。