可以在运行中创建子类。这并不意味着你应该。无论如何,我会提供一个机制。
的基地每班属性告诉你的继承链:
class Animal(object):
pass
class Dog(Animal):
pass
print Animal.__bases__
print Dog.__bases__
# prints:
#(<type 'object'>,)
#(<class '__main__.Animal'>,)
所以,__bases__
与“传承基地”的元组。你可以替换这个元组(你不能“追加到它”或“从它弹出”,因为它是一个元组,而元组是不可变的)。例如,假设你有一个“混合类”,这增加了功能的一些动物的子类而不是其他:
class Animal(object):
pass
class Dog(Animal):
pass
class Cat(Animal):
pass
class TalkMixin(object):
def talk(self):
print("I talk like a {0}".format(self.__class__.__name__))
if __name__ == "__main__":
dog = Dog()
cat = Cat()
try:
dog.talk()
cat.talk()
except AttributeError:
print("Great - the program raised AttributeError, as expected")
# now, add the MixIn to the class "Dog", but not to the class
# "Cat" - do this on the fly:
old_dog_bases = Dog.__bases__
Dog.__bases__ = (Animal, TalkMixin)
# this should be successful!
dog.talk()
try:
cat.talk()
except AttributeError:
print("As expected, cat.talk() raised AttributeError")
# now do the same (add the mixin dynamically - via inheritance) to
# the Cat
old_cat_bases = Cat.__bases__
Cat.__bases__ = (Animal, TalkMixin)
# this should be successful!
cat.talk()
# Now, remove the mixin (drop from the inheritance) for both cats
# and dogs:
Dog.__bases__ = old_dog_bases
Cat.__bases__ = old_cat_bases
try:
dog.talk()
cat.talk()
except AttributeError:
print("as expected, they can no longer talk")
产生以下输出:
Great - the program raised AttributeError, as expected
I talk like a Dog
As expected, cat.talk() raised AttributeError
I talk like a Cat
as expected, they can no longer talk
很多人认为混入类恶。他们可能是对的!你可以想象,如果你搞砸基地属性,你几乎摧毁了你的程序。所以,它是 - 你可以动态地改变一个对象的继承,但这并不意味着你应该(可能抽象类或概念实现?)
你有没有复习这个问题http://stackoverflow.com/questions/ 3915024 /动态创建类-python? – amirouche 2012-02-14 00:05:31
你是什么意思的单身元类? – amirouche 2012-02-14 00:05:45
@abki我没有。现在正在阅读... – blz 2012-02-14 00:13:02