Хорошо, опять же, это не то, что вы обычно должны делать, это только для информационных целей.
Где Python ищет метод для объекта экземпляра, определяется атрибутом __mro__
класса, который определяет этот объект ( M ethod R esolution O атрибут rder).Таким образом, если бы мы могли изменить __mro__
из Person
, мы бы получили желаемое поведение.Примерно так:
setattr(Person, '__mro__', (Person, Friendly, object))
Проблема в том, что __mro__
является атрибутом только для чтения, и, следовательно, setattr не будет работать.Возможно, если вы гуру Python, есть способ обойти это, но, очевидно, я не достигаю статуса гуру, потому что не могу придумать его.
Возможный обходной путь - просто переопределить класс:
def modify_Person_to_be_friendly():
# so that we're modifying the global identifier 'Person'
global Person
# now just redefine the class using type(), specifying that the new
# class should inherit from Friendly and have all attributes from
# our old Person class
Person = type('Person', (Friendly,), dict(Person.__dict__))
def main():
modify_Person_to_be_friendly()
p = Person()
p.hello() # works!
Чего не требуется, так это измените любые ранее созданные экземпляры Person
, чтобы они имели метод hello()
.Например (просто изменив main()
):
def main():
oldperson = Person()
ModifyPersonToBeFriendly()
p = Person()
p.hello()
# works! But:
oldperson.hello()
# does not
Если детали вызова type
не ясны, прочитайте e-sat 'превосходный ответ' Что такое метаклассв Python? '.