3

我正在阅读有关 Python 中的反射的内容,并遇到了以下声明:

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

此处对此进行了说明。

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

class Child():
    nmbrMovies = 0
    nmbrBooks  = 3

class Adult():
    nmbrMovies = 2
    nmbrBooks  = 5

class Member(Child):
    pass

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

有人知道我想要做的事情是否可行吗?还是我误解了 Python 的那个属性?

4

1 回答 1

6
class Child():
    nmbrMovies = 0
    nmbrBooks  = 3

class Adult():
    nmbrMovies = 2
    nmbrBooks  = 5

class Member(Child):
    pass

x = Member()

Member开始继承自Child

print(Member.__bases__)
# (<class __main__.Child at 0xb74a141c>,)

可以将其更改为Adult

Member.__bases__ = (Adult,)
print(Member.__bases__)
# (<class __main__.Adult at 0xb74a144c>,)

现在x.nmbrMovies发现Adult.nmbrMovies

print(x.nmbrMovies)
# 2

也可以更改实例的类。x开始作为一个实例Member

print(x.__class__)
# __main__.Member

但我们可以将其更改为Child

x.__class__ = Child
print(x.nmbrMovies)
# 0
于 2013-01-10T02:18:08.733 回答