2013-01-10 19 views
3

我读到关于在Python反射和过这个声明是:改变对象的超在Python

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

这是here陈述。

我试图执行一个例子,我可以修改类实例的Python中:最初从子类继承

class Child(): 
    nmbrMovies = 0 
    nmbrBooks = 3 

class Adult(): 
    nmbrMovies = 2 
    nmbrBooks = 5 

class Member(Child): 
    pass 

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

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

回答

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 
+0

谢谢你的出色答卷。特别是一个类的超类和一个类的实例的变化之间的比较是非常有帮助的。 – Consec