Как изменить родительский объект атрибута. (как таковой, что self.myobject.myattribute становится self.myattribute) - PullRequest
0 голосов
/ 21 июня 2019

прежде всего мои извинения в случае, если у меня есть или будут смешаны такие термины, как объект, класс, атрибут, родитель, потомок.Этот вопрос не относится к наследованию классов.

В моем основном классе (называемом родительским) я вызываю функцию, которая возвращает объект (именуемый дочерним) и присваивает его родителю в качестве атрибута.На этот дочерний элемент теперь можно ссылаться как обычно через parent.child, а дочерние атрибуты - через parent.child.attribute.

Теперь моя цель - найти способ доступа ко всем атрибутам дочернего элемента в качестве атрибутов родителя.В сущности, чтобы поднять все эти атрибуты на один уровень вверх.

Интуитивно, одно решение состоит в том, чтобы перебрать все дочерние атрибуты через child.__dict__ (или что-то подобное), а затем динамически создать атрибуты в родительском объекте, которые имеютто же имя, что и найденные атрибуты.Однако это кажется довольно неэффективным, и я читал, что динамического создания переменных следует избегать, когда это возможно.

Первоначально

def stub_that_returns_object():
    return Child()

class Parent():
    def __init__(self):
        self.child = stub_that_returns_object()

class Child():
    def __init__(self):
        self.somestr= "foo"
        self.someint = 42
        self.someobj = object()

p = Parent()
print(p.child.somestr)

Теперь мне нужен какой-то умный способ вызова функции неизменяемой (!) Stub_that_returns_object ", но вместо использования дочернего объекта я хочу иметь возможность доступа к атрибутам.как

p = Parent()
print(p.somestr)

... и т. д.

Надеюсь, я немного понял себя. Дочерний объект может быть удален в процессе повышения всех его атрибутов.

Спасибо!

1 Ответ

0 голосов
/ 21 июня 2019

Если я правильно понимаю, вы хотите получить доступ к атрибуту child из родительского класса.

Вы можете сделать это, имея метод в родительском классе, который возвращает атрибут потомка:

class Parent():
   def __init__(self):
        self.child = stub_that_returns_object()

   def getSomestr():
        return self.child.somestr

class Child():
    def __init__(self):
        self.somestr= "foo"
        self.someint = 42
        self.someobj = object()

p = Parent()
print(p.getSomestr())

А с другой стороны, если вы хотите, чтобы родительский элемент имел атрибут дочернего, вы также можете назначить тот же атрибут для родительского класса, начиная с

...