Мне интересно, можно ли сделать метод, который ведет себя по-разному, когда вызывается как метод класса, чем при вызове как метод экземпляра.
Например, в качестве проекта улучшения навыков я пишу класс Matrix
(да, я знаю, что есть уже неплохие классы матриц уже там). Я создал метод класса для него под названием identity
, который возвращает идентификационную матрицу указанного размера.
Теперь, когда вызывается экземпляр Matrix
, кажется логичным, что размер не нужно указывать; он должен вернуть идентификационную матрицу того же размера, что и вызываемый Matrix
.
Другими словами, я хотел бы определить метод, который может определить, был ли он вызван через экземпляр и, если это так, получить доступ к этим атрибутам экземпляра. К сожалению, даже после проработки документации и нескольких поисковых запросов Google я не нашел ничего, что предполагает, что это возможно. Кто-нибудь знает по-другому?
Edit:
Ничего себе! Понятно, что я до сих пор не привык к первоклассным функциям. Вот что я получил - благодаря Unknown для предоставления ключа!
class Foo(object):
def __init__(self, bar):
self.baz = bar
self.bar = MethodType(lambda self: self.__class__.bar(self.baz), self, self.__class__)
@classmethod
def bar(cls, baz):
return 5 * baz
Foo.bar(3) # returns 15
foo = Foo(7)
foo.bar() # returns 35
Изменить 2:
Простое примечание - этот метод (и большинство из представленных ниже) не будет работать над классами, которые определяют __slots__
, поскольку вы не можете переназначить этот метод.