[英]dynamic class with inheritance in python
如何在课程中动态创建课程? 正如我在下面尝试的,我得到一个NameError:名称'Foo未定义。 我是Python的新手,如果很明显,请原谅我。
class Parent(object):
name2class = {'foo' : Foo, 'bar' : Bar }
def do(self,string):
return name2class[string]()
class Foo(Parent):
pass
class Bar(Parent):
pass
if __name__ == '__main__':
parent = Parent()
instance = parent.do()
在撰写本文时,您需要在Parent
Foo
和Bar
,因为Parent
引用了其他类。
编辑:您只需要将这些类引用移动到方法中:
class Parent(object):
def do(self,string):
name2class = {'foo' : Foo, 'bar' : Bar }
return name2class[string]()
class Foo(Parent):
pass
class Bar(Parent):
pass
if __name__ == '__main__':
parent = Parent()
instance = parent.do('foo')
Edit2:这是您的出厂版本:
class Parent(object):
# Add shared methods here
pass
class Foo(Parent):
# Add unique methods
pass
class Bar(Parent):
# Add unique methods
pass
class ParentFactory(object):
def __init__(self):
self.name2class = {'foo' : Foo, 'bar' : Bar}
def create(self, string):
return self.name2class[string]()
if __name__ == '__main__':
factory = ParentFactory()
instance = factory.create('foo')
Foo和Bar类不是在name2class字典实例化需要它们时定义的。 另一个错误是没有参数传递给Parent.do()
class Parent(object):
def __init__(self):
self.name2class = {'foo' : Foo, 'bar' : Bar}
def do(self, string):
return self.name2class[string]()
class Foo(Parent):
pass
class Bar(Parent):
pass
if __name__ == '__main__':
parent = Parent()
instance = parent.do('foo')
您可以使用python
type(name, bases, dict)
functuion:...
class Parent(object):
childs = {}
def somefunc(self):
print "Hello from, %s"%self
def do(self, string):
return self.childs[string]()
class Foo(Parent):
pass
class Bar(Parent):
pass
parent = Parent()
parent.somefunc()
parent.childs["foo"] = Foo
parent.childs["bar"] = Bar
foo = parent.do("foo")
foo.somefunc()
bar = parent.do("bar")
bar.somefunc()
这给了我:
Hello from, <__main__.Parent object at 0x...>
Hello from, <__main__.Foo object at 0x...>
Hello from, <__main__.Bar object at 0x...>
定义新的子类不应影响基类的实现。 此处合适的设计模式是工厂。 从简单的功能到动态注册机制,有多种实现方法。 比较简单的版本:
class Parent(object):
# your code here
pass
class Child1(Parent):
# XXX
class Child2(Parent):
# XXX
class Child2(Parent):
# XXX
CLSMAP = {
"name1": Child1,
"name2": Child2,
"name3": Child3,
}
def create(name, *args, **kw):
return CLSMAP[name](*args, **kw)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.