繁体   English   中英

python中具有继承的动态类

[英]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 FooBar ,因为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM