在Python中更改对象的超类

Jas*_*ack 3 python reflection

我正在阅读有关Python中的反射并且遇到了这样的声明:

结构反思.可以修改类提供的方法集和对象​​具有的字段集.我们还可以修改对象是实例的类,以及类继承的超类集.

这是在这里说的.

我试图实现一个示例,我可以在Python中修改实例的类:

class Child():
    nmbrMovies = 0
    nmbrBooks  = 3

class Adult():
    nmbrMovies = 2
    nmbrBooks  = 5

class Member(Child):
    pass
Run Code Online (Sandbox Code Playgroud)

我希望有一个成员类的实例说,x它最初继承自Child类,因此继承了可以在虚构库中租用的最大数量的电影和书籍.当person/member成为a时Adult,我想简单地将成员的超类更改为Adult.我知道这不是实现这种结构的简单方法,但我想要一个例子来测试Python的这个功能.

有人知道我想做什么是可能的吗?还是我误解了Python的属性?

unu*_*tbu 6

class Child():
    nmbrMovies = 0
    nmbrBooks  = 3

class Adult():
    nmbrMovies = 2
    nmbrBooks  = 5

class Member(Child):
    pass

x = Member()
Run Code Online (Sandbox Code Playgroud)

Member开始继承自Child:

print(Member.__bases__)
# (<class __main__.Child at 0xb74a141c>,)
Run Code Online (Sandbox Code Playgroud)

可以将其更改为Adult:

Member.__bases__ = (Adult,)
print(Member.__bases__)
# (<class __main__.Adult at 0xb74a144c>,)
Run Code Online (Sandbox Code Playgroud)

现在x.nmbrMovies发现Adult.nmbrMovies:

print(x.nmbrMovies)
# 2
Run Code Online (Sandbox Code Playgroud)

也可以更改实例的类.x从一个例子开始Member:

print(x.__class__)
# __main__.Member
Run Code Online (Sandbox Code Playgroud)

但我们可以改变它来说Child:

x.__class__ = Child
print(x.nmbrMovies)
# 0
Run Code Online (Sandbox Code Playgroud)