Python - как получить ссылку на экземпляр класса из класса атрибута? - PullRequest
1 голос
/ 02 декабря 2010
class A()    
    att = B()    

class B()    
    ...

a = A()

b = B()

a.att = b

Как b может получить ссылку на a?Мне нужно получить атрибут здесь.

Спасибо!

Ответы [ 5 ]

0 голосов
/ 02 декабря 2010

Вы можете создать общий класс "Reference ()", который будет хранить любую ссылку на себя в словаре атрибутов.

class Reference(object):
    def __init__(self):
        self.references = {}

    def __setattr__(self, key, value):
        if hasattr(self, 'references'):
            if isinstance(value, Reference):
                if not key in value.references:
                    value.references[key] = []
                value.references[key].append(self)

            elif value is None and hasattr(self, key):
                old = getattr(self, key).references
                if key in old and self in old[key]:
                    old[key].remove(self)

        super(Reference, self).__setattr__(key, value)

А затем создайте свои классы:

class A(Reference):
    def __init__(self):
        super(A, self).__init__()
        self.att = None

class B(Reference):
    def __init__(self):
        super(B, self).__init__()
        self.att = None

И используйте это:

a = A()
b = B()

print 'A references', a.references
print 'B references', b.references
# A references {}
# B references {}

a.att = b

print 'A references', a.references
print 'B references', b.references
# A references {}
# B references {'att': [<__main__.A object at 0x7f731c8fc910>]}

В конце вы получите обратную ссылку на весь класс Reference из любых свойств

0 голосов
/ 02 декабря 2010
class A(object):

    def __init__(self):
        self._att=None

    @property
    def att(self):
        return self._att

    @att.setter
    def att(self, value):
        self._att = value
        value.parent = self


class B(object):

    pass

a = A()

b = B()

a.att = b
print b.parent
0 голосов
/ 02 декабря 2010
class A(object):
    def __init__(self):
        self.att = B(self)

class B(object):
    def __init__(self, a):
        self.a = a

a = A()

a.att.a is a

или иначе,

class A(object):
    def __init__(self, b):
        b.a = self
        self.att = b

class B(object):
    pass

a = A(B())

a.att.a is a
0 голосов
/ 02 декабря 2010

Этот код не имеет большого смысла ... но если я правильно понимаю ваш вопрос ...

class A(object):
    pass     #or whatever you like

class B(object):
    def __init__(self, ref):  #accept one argument
        self.ref = ref

a = A()

b = B(a) #pass `a` as that argument

a.att = b

Может быть один ответ.

0 голосов
/ 02 декабря 2010

Самый простой способ - просто добавить дополнительный параметр функции к методу в B, который нуждается в A, и пропустить его при вызове.Или просто заставьте B init принять A в качестве аргумента и изменить бит в init A на att = B (self)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...