<p>可能有比类切换更好的方法(可能类似于<a href="https://en.wikipedia.org/wiki/Strategy_pattern" rel="nofollow noreferrer">strategy pattern</a>),但是如果您真的想这样做,您可以分配给实例<code>__class__</code>:</p>
<pre><code>class Book(object):
def __init__(self, title):
self.title = title
def setCategory(self, category):
self.category = category
self.__class__ = classes[category] # IMPORTANT
class RomanceBook(Book):
def __init__(self, title):
super(RomanceBook, self).__init__(title)
self.category = 'romance'
def getTitle(self):
return self.title.upper()
class FictionBook(Book):
def __init__(self, title):
super(FictionBook, self).__init__(title)
self.category = 'fiction'
def getTitle(self):
return self.title.lower().replace(' ', '_')
classes = {
'romance': RomanceBook, # IMPORTANT
'fiction': FictionBook, # IMPORTANT
}
</code></pre>
<p>或者,如果要使用元类自动添加到<code>classes</code>:</p>
<pre><code>classes = {}
class BookMetaclass(type):
def __new__(cls, name, bases, attrs):
new_class = type.__new__(cls, name, bases, attrs)
if name != "Book":
classes[new_class.category] = new_class
return new_class
class Book(object, metaclass=BookMetaclass):
def __init__(self, title):
self.title = title
def setCategory(self, category):
self.category = category
self.__class__ = classes[category]
...
</code></pre>
<p>策略模式示例:</p>
<pre><code>class Book(object):
title_funcs = {
'romance': lambda title: title.upper(),
'fiction': lambda title: title.lower().replace(' ', '_'),
}
def __init__(self, category, title):
self.category = category
self.title = title
def setCategory(self, category):
self.category = category
def getTitle(self):
return self.title_funcs[self.category](self.title)
</code></pre>