Я хочу, чтобы свойства из атрибута моего класса были доступны напрямую через экземпляр класса (без наследования от него). Так что в основном, если у меня есть:
class A:
@property
def foo(self):
print("foo")
@property
def bar(self):
print("bar")
class B:
def __init__(self):
self._a = A()
Вместо того, чтобы делать b._a.bar
Я хочу иметь возможность сделать b.bar
. Основываясь на этом ответе здесь , я попробовал следующее в классе B:
class B:
def __init__(self):
self._a = A()
attrs = [attr for attr in dir(self._a)
if not callable(self._a.__getattribute__(attr))
and not attr.startswith("__")]
for attr in attrs:
setattr(self.__class__, attr,
property(lambda s: s._a.__getattribute__(attr)))
Но когда я создаю и проверяю его, я получаю один из странных моментов Python:
>>> b = B()
foo
bar
>>> b.foo
bar
>>> b.bar
bar
- Почему при создании экземпляра распечатываются как 'foo', так и 'bar'?
- Как свойство 'foo' указывает на тот же метод получения, что и 'bar'?