擅长:python、mysql、java
<p>这将动态定义一个新类<code>GentlePerson</code>,并将<code>p</code>的类重新分配给它:</p>
<pre><code>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"
</code></pre>
<p>根据您的请求,这将修改<code>p</code>的基,但不会更改<code>p</code>的原始类<code>Person</code>。因此,<code>Person</code>的其他实例不受影响(如果调用<code>introduce_self</code>,则会引发<code>AttributeError</code>)。</p>
<hr/>
<p>虽然在这个问题中没有直接问到这个问题,但是我要补充的是,对于Google和好奇者来说,也可以动态地改变一个类的基,但是(AFAIK)只有当这个类没有直接从<code>object</code>继承时:</p>
<pre><code>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
</code></pre>