blz*_*blz 6 python singleton class subclass subclassing
我正在创建一个游戏,其中我有一个复杂的方法来创建实体.
加载级别时,加载代码会读取一堆YAML文件,这些文件包含所有不同可能单元的属性.使用YAML文件,它创建一个所谓的EntityResource对象.此EntityResource对象在生成新单元时充当信息的权威来源.目标是双重的:
EntityResource然后将这些对象馈送到EntityFactory对象中以生成特定类型的单元.
我的问题如下. 有没有办法EntityResource根据正在读入的YAML文件的内容动态创建子图?
另外,我希望为这些YAML文件派生的每个子类分配一个单独的元类.有什么警告吗?
jco*_*ado 24
我不确定这是否是您正在寻找的,但您可以用来type动态创建子类:
SubClass = type('SubClass', (EntityResource,), {})
Run Code Online (Sandbox Code Playgroud)
编辑:要了解其type工作原理,您只需要翻译如何编写课程并将其转换为type调用.例如,如果你想写类似的东西:
class SubClass(EntityResource):
A=1
B=2
Run Code Online (Sandbox Code Playgroud)
然后,那将被翻译为:
SubClass = type('SubClass', (EntityResource,), {'A': 1, 'B': 2})
Run Code Online (Sandbox Code Playgroud)
哪里:
可以动态创建子类。这并不意味着您应该这样做。无论如何,我会提供一个机制。
每个类中的bases属性告诉你继承链:
class Animal(object):
pass
class Dog(Animal):
pass
print Animal.__bases__
print Dog.__bases__
# prints:
#(<type 'object'>,)
#(<class '__main__.Animal'>,)
Run Code Online (Sandbox Code Playgroud)
所以,__bases__是一个带有“继承基础”的元组。您可以替换此元组(您不能“附加到它”或“从中弹出”,因为它是一个元组,并且元组是不可变的)。例如,假设您有一个“mixin 类”,它为某些动物子类添加了功能,但不为其他动物添加功能:
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")
Run Code Online (Sandbox Code Playgroud)
产生以下输出:
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
Run Code Online (Sandbox Code Playgroud)
很多人认为 MixIn 类是邪恶的。他们可能是对的!你可以想象如果你弄乱了bases属性,你几乎毁了你的程序。所以,就是这样 - 您可以动态更改对象的继承,但这并不意味着您应该(可能是抽象类或概念实现?)
| 归档时间: |
|
| 查看次数: |
6318 次 |
| 最近记录: |