判断是否使用了对象的属性

时间:2019-05-22 12:32:21

标签: python-3.x

我想知道在与对象交互结束时使用了哪些属性。

我考虑过在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__中)。

1 个答案:

答案 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,请问您要使用此功能解决哪个问题?