Как я могу добавить свойство, подобное свойствам, к экземпляру класса? - PullRequest
0 голосов
/ 09 ноября 2018

Мне нужно «хай-джек» доступ к члену экземпляра объекта без изменения поведения всех экземпляров этого класса. Это достижимо?

Рассмотрим следующий урезанный код:

class S(object):
    pass

Class C(object):
    def __init__(self, s):
        self.r = -1
        self.s = s
        # Add missing bits here?

s = S()    
c = C(s)
print c.s.r # => should return the value of c.r, i.e. -1
c.s.r = -2  # should modify the value of c.r
s.r = -3    # ditto, should modify the value of c.r

Обратите внимание, что данный экземпляр S может использоваться изолированно, а также совместно для нескольких C объектов, поэтому установка свойства на S.__class__ не работает (или, по крайней мере, в любом воплощении I '). до сих пор удалось придумать).

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

цифра, которую я опубликую, чем закончил:

import weakref

class S(object):
    def __init__(self):
        self._r = -1

    @property
    def r(self):
        try:
            return self._c.r
        except (AttributeError, ReferenceError):
            return self._r

    @r.setter
    def r(self, value):
        try:
            self._c.r = value
        except (AttributeError, ReferenceError):
            self._r = value


class C(object):
    def __init__(self, s):
        self._r = -2
        s._c = weakref.proxy(self)
        self.s = s

    @property
    def r(self):
        return self._r

    @r.setter
    def r(self, value):
        self._r = value

def printRs(s, c):
    print "s.r", s.r
    if c:
        print "c.r", c.r
        print "c.s.r", c.s.r

s = S()
c = C(s)
printRs(s, c)  # => -2 on all
c.r = 0
printRs(s, c)  # => 0 on all
s.r = 1
printRs(s, c)  # => 1 on all
c.s.r = 2
printRs(s, c)  # => 2 on all
c = None
printRs(s, c)  # => -1 on s.r
0 голосов
/ 09 ноября 2018
class S(object):
    def __init__(self, r):
        self.r = r

class C(object):
    def __init__(self, s):
        self.s = s

s = S(-1)    
c = C(s)
print(c.s.r)
c.s.r = -2 

print(c.s.r)
print(s.r)

s.r = -3 

print(c.s.r)
print(s.r)
...