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

Итак, я читал о композиции в Python, и мне интересно, есть ли способ интегрировать установку атрибутов «базовых объектов», не ссылаясь конкретно на «базовый класс» (как это делается в закомментированных частяхприведенный ниже код.

Итак, я ищу приведенный ниже код для печати:

1
2    
3    
4
Success

Но с помощью этого фрагмента я генерирую RecursionError.

IsЕсть ли способ (кроме self.ax = n) обновить атрибут класса A, чтобы он был доступен другим составным классам (класс C в этом примере)?

class A:
    def __init__(self):
        self.x = 1

class B:
    def __init__(self, a):
        self.a = a
        self.y = 2
        print(self.x)
        print(self.y)
        self.x = 3  
        # would work if "self.a.x = 3"
        # and "__setattr__" commented out

    def __getattr__(self, attr):
        return getattr(self.a, attr)

    # setattr would have to be commented out here too
    def __setattr__(self, attr, val):
        setattr(self.a, attr, val)

class C:
    def __init__(self, a):
        self.a = a
        print(self.x)
        self.x = 4
        print(self.x)
        try:
            print(self.y)
        except AttributeError:
            print('Sucess')

    def __getattr__(self, attr):
        return getattr(self.a, attr)

    def __setattr__(self, attr, val):
        setattr(self.a, attr, val)

a = A()
b = B(a)
c = C(a)

1 Ответ

0 голосов
/ 09 декабря 2018

Возможно, но вам нужно отфильтровать эту переменную.

class A:
    def __init__(self):
        self.x = 1

class B:
    def __init__(self, a):
        self.a = a
        self.x = 2
        self.y = 3  

    def __getattr__(self, attr):
        return getattr(self.a, attr)

    # setattr would have to be commented out here too
    def __setattr__(self, attr, val):
        if attr != "a":
            setattr(self.a, attr, val)
        else:
            super().__setattr__(attr, val)

a = A()
b = B(a)
print(a.x)
print(a.y)
...