Ответ 1
Это динамически определяет новый класс GentlePerson
и переназначает класс p
:
class Gentleman(object):
def introduce_self(self):
return "Hello, my name is %s" % self.name
class Person(object):
def __init__(self, name):
self.name = name
p = Person("John")
p.__class__ = type('GentlePerson',(Person,Gentleman),{})
print(p.introduce_self())
# "Hello, my name is John"
По вашему запросу это изменяет базы p
, но не изменяет p
оригинальный класс Person
. Таким образом, другие экземпляры Person
не затронуты (и поднимут AttributeError
, если были вызваны introduce_self
).
Хотя вопрос не был задан напрямую, я добавлю для искателей и искателей любопытства, что также возможно динамически изменять базы классов, но (AFAIK), только если класс не наследует непосредственно из object
class Gentleman(object):
def introduce_self(self):
return "Hello, my name is %s" % self.name
class Base(object):pass
class Person(Base):
def __init__(self, name):
self.name = name
p = Person("John")
Person.__bases__=(Gentleman,object,)
print(p.introduce_self())
# "Hello, my name is John"
q = Person("Pete")
print(q.introduce_self())
# Hello, my name is Pete