Это динамически определяет новый класс 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