我想知道在与对象交互结束时使用了哪些属性。
我考虑过在getter周围使用装饰器(计数器或某物)来检测该方法是否已被调用,但是可以直接访问该属性。
class X:
def __init__(self, x=None):
self.x = x
def __str__(self):
return "<x: {}>".format(self.x)
xx = X()
print(xx)
print(xx.x)
我想得到:属性x被使用了2次或3次(初始化时在__init__
中)。
答案 0 :(得分:2)
使用属性:
class X:
def __init__(self, x=None):
self._xcounter = 0
self.x = x
@property
def x(self):
self._xcounter += 1
return self._x
@x.setter
def x(self, value):
# you can also update _xcounter here if you want
# to count write access too, or use two counters
# (one for read and one for write)
self._x = value
# exposes xcounter as a read-only property
# so we don't break encapsulation
@property
def xcounter(self):
return self._xcounter
def __str__(self):
return "<x: {}>".format(self.x)
xx = X()
print(xx)
print(xx.x)
print("xx.x was used {} times".format(xx.xcounter))
仅在对象本身内部使用而获得计数会很棒
这可能会变得更加棘手-从技术上讲,a method is really a function(因此,self
参数-否则该函数无法访问当前实例),因此没有“在对象内部”的真正概念。您当然可以取消使用该属性(将x
保留为普通的公共属性,添加一个私有_x
属性,并且仅在内部使用该私有属性),即:
class X:
def __init__(self, x=None):
self._xcounter = 0
self._x = x
@property
def _x(self):
self._xcounter += 1
return self.x
@x.setter
def _x(self, value):
self.x = value
# exposes xcounter as a read-only property
@property
def xcounter(self):
return self._xcounter
def __str__(self):
return "<x: {}>".format(self._x)
但是对我来说,这有点像WTF。 FWIW,请问您要使用此功能解决哪个问题?