Очень простой вопрос.
У меня есть фиктивный класс:
class SomeClass:
""" just a docstring"""
a = 5
dir(SomeClass) возвращает следующие атрибуты, связанные с этим классом:
>>> dir(SomeClass)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__form
at__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_s
ubclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__',
'__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclas
shook__', '__weakref__', 'a']
>>>
Я заметил, что если я вызову SomeClass.__getattribute__, даже если я передам ему аргумент (который, по его словам, требуется), сообщение об ошибке говорит, что я не передаю никакого аргумента.
>>> SomeClass.__getattribute__('a')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: expected 1 arguments, got 0
>>>
Примечание. Дело не в том, что у меня есть прецедент для вызова __getattribute__ таким образом. (На самом деле это кажется неправильным, потому что вместо этого я хотел бы вызвать его для экземпляра SomeClass , который ДЕЙСТВИТЕЛЬНО работает). Мне просто любопытно поведение __getattribute__: почему в сообщении об ошибке говорится, что у него 0 аргументов, когда я на самом деле передаю ему аргумент? Я не оспариваю, что мое использование неверно - просто, почему __getattribute__ не распознает, что ему был передан аргумент?
Я заметил, что __getattribute__ указан как «slotwrapper». Это имеет отношение к этому? Мне трудно понять, в чем реальная разница между вызовом слот-обертки и вызовом функции. Отбрасывает ли этот слот-упаковщик аргумент, который я ему передал, из-за того, как я его назвал?
>>> SomeClass.__getattribute__
<slot wrapper '__getattribute__' of 'object' objects>
>>>