Чтобы дать вам некоторый контекст, вчера я наткнулся на этот пост . Я нашел проблему довольно интересной, поэтому я попытался найти решение, которое сохраняло бы синтаксис как можно ближе к тому, о чем просили. Вот что я придумал:
class DummyCube:
cubes = []
@classmethod
def __getattribute__(cls, name):
print('is this called?')
attributes = [getattr(cube, name) for cube in cls.cubes]
return attributes
class Cube:
def __init__(self, volume):
DummyCube.cubes.append(self)
self.volume = volume
a = Cube(1)
b = Cube(2)
c = Cube(3)
print(DummyCube.__getattribute__('volume'))
print(DummyCube.volume)
Я думаю, что мой подход слишком сложен (или просто в целом не очень хорош), особенно по сравнению с принятым в настоящее время ответом, но, к счастью, это не очень актуально для что я хотел бы знать.
Мой подход не работает, потому что DummyCube.volume
вызывает AttributeError: type object 'DummyCube' has no attribute 'volume'
, что, конечно, верно, но я не понимаю, почему мой собственный метод класса __getattribute__
не вызывается . Вызов метода работает напрямую. Неужели это вообще невозможно? Что мне здесь не хватает? Насколько я понимаю, __getattribute__
- это то, что вызывается первым при использовании нотации '.', Но отслеживание ошибок не позволяет мне это подтвердить.