У вас есть фундаментальное недопонимание классов и Python.
B.sub1.attr = 'some string'
не работает
B
- это тип <class 'B'>
. Нет атрибута sub1
в типе B
.
Однако
Я полагаю, вы ожидали тип <class 'A'>
, вы можете сделать это, определив этот атрибут на уровне класса:
>>> class A:
... pass
...
>>> class B:
... sub1 = A()
...
>>> B.sub1
<__main__.A object at 0x7fa2e1d1c490>
Странно, тот же sub1
также доступен в качестве атрибута экземпляра. Это ошибка в python, если вы, как и я, открыты для обсуждения.
>>> b = B()
>>> b.sub1
<__main__.A object at 0x7fa2e1d1c490>
setattr(B, 'sub1.attr1', 'some string')
работает
setattr
всегда будет работать, если первый параметр является экземпляромкласса. Это заставляет атрибут быть доступным. Он создает атрибуты в объектах класса.
B.sub1.attr1
не работает. В то время как getattr(B, 'sub1.attr1')
делает
Это самый странный из всех, и я тоже не знал. Это сводится к вызову на setattr(B, 'sub1.attr1', 'some string')
как раз перед. Как уже говорилось, это заставляет атрибут.
Я считаю, что происходит то, что вы не можете получить доступ к этому атрибуту через синтаксис Python, поскольку имя атрибута на самом деле содержит точку sub1.attr1
. Но вы можете передать необработанную строку в качестве имени атрибута в getattr
, и именно поэтому он работает.
Однако
Что вы, вероятно, хотели сделать в этом сценарии, это установить атрибут вэкземпляр класса 'A'.
>>> class A:
... def __init__(self):
... self.attr1 = 'attr A'
...
>>> class B:
... pass
...
>>> setattr(B, 'sub1', A())
>>> B.sub1.attr1
'attr A'
Но в этот момент атрибут sub1.attr1
не существует!
>>> getattr(B, 'sub1.attr1')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: type object 'B' has no attribute 'sub1.attr1'
Заключение
Выделать очень странные вещи со встроенными функциями getattr
и setattr
. Это хорошо, если вы учитесь, но для успешного использования таких функций необходимо знать, что происходит в языке.
При достаточном количестве магии имя атрибута может действительно иметь .
s.