3

Python のリフレクションについて読んでいて、次のステートメントに出くわしました。

構造反射。クラスが提供するメソッドのセットとオブジェクトが持つフィールドのセットを変更することができます。オブジェクトのインスタンスであるクラスと、クラスが継承するスーパークラスのセットを変更することもできます。

これはここに記載されています。

Python でインスタンスのクラスを変更できる例を実装しようとしました。

class Child():
    nmbrMovies = 0
    nmbrBooks  = 3

class Adult():
    nmbrMovies = 2
    nmbrBooks  = 5

class Member(Child):
    pass

ここで、最初に Child クラスから継承する Member クラスのインスタンスを作成してx、架空の図書館でレンタルできる映画と本の最大量を継承します。人/メンバーが になっ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 に答える