3

我正在制作一个使用类的python程序,我希望一个类只能选择性地从另一个类继承,例如:

class X(object):
    def __init__(self):
        self.hello = 'hello'

class Y(object):
    def __init__(self):
        self.moo = 'moo'

class Z():
    def __init__(self, mode):
        if mode == 'Y':
             # Class will now Inherit from Y
        elif mode == 'X':
             # Class will now Inherit for X

我怎么能做到这一点而不上另一堂课?

4

4 回答 4

3

在 Python 中,类可以在运行时创建:

class X(object):
    def __init__(self):
        self.hello = 'hello'

class Y(object):
    def __init__(self):
        self.moo = 'moo'

def create_class_Z(mode):
    base_class = globals()[mode]
    class Z(base_class):
        def __init__(self):
            base_class.__init__(self)
    return Z

ZX = create_class_Z('X')
zx = ZX()
print(zx.hello)

ZY = create_class_Z('Y')
zy = ZY()
print(zy.moo)
于 2012-09-19T09:44:33.900 回答
2

您可以通过覆盖__new__和更改传入的方法来做到这一点(您正在通过附加或作为基类cls创建新类型):XY

class X(object):
    def __init__(self):
        self.hello = 'hello'

class Y(object):
    def __init__(self):
        self.moo = 'moo'

class Z(object):
    def __new__(cls, mode):
        mixin = {'X': X, 'Y': Y}[mode]
        cls = type(cls.__name__ + '+' + mixin.__name__, (cls, mixin), {})
        return super(Z, cls).__new__(cls)
    def __init__(self, mode, *args, **kwargs):
        super(Z, self).__init__(*args, **kwargs)

请注意,您需要绕过Z.__new__usingsuper以避免无限递归;这是__new__特殊覆盖方法的标准模式。

于 2012-09-19T09:45:58.203 回答
0

使用的解决方案type

class _Z(): pass #rename your class Z to this

def Z(mode): #this function acts as the constructor for class Z
    classes = {'X': X, 'Y': Y, 'Foo': Bar} #map the mode argument to the base cls
    #create a new type with base classes Z and the class determined by mode
    cls = type('Z', (_Z, classes[mode]), {})
    #instantiate the class and return the instance
    return cls()
于 2012-09-19T09:55:03.117 回答
0

我认为你最好在 Z 中定义两个成员,一个是 X 的类实例,另一个是 Y 的实例。您可以在使用不同的模式时获取这些实例中存储的关联信息。

于 2012-09-19T09:36:43.113 回答