gpt4 book ai didi

python - 如何在实例化时有条件地将 mixin 添加到当前类中?

转载 作者:太空狗 更新时间:2023-10-30 01:58:26 26 4
gpt4 key购买 nike

我想要一个基于传递给构造函数的参数添加混合的类。这是我试过的:

class MixinOne(object):
def print_name(self):
print("{} is using MixinOne.".format(self.name))


class MixinTwo(object):
def print_name(self):
print("{} is using MixinTwo.".format(self.name))


class Sub(object):

def __new__(cls, *args, **kwargs):

mixin = args[1]

if mixin == 'one':
bases = (MixinOne,) + cls.__bases__
elif mixin == 'two':
bases = (MixinTwo,) + cls.__bases__

return object.__new__(type('Sub', bases, dict(cls.__dict__)))

def __init__(self, name, mixin):

print('In Sub.__init__')

self.name = name

唯一的问题似乎是 __init__ 没有被调用,所以 print_name 方法将不起作用。

  1. 如何让 Sub 上的 __init__ 触发?

  1. 有更好的方法吗?

最佳答案

这是使用元类的好地方。您可以将自定义混合包含代码放在元中,然后您的 Sub 类不需要样板文件:

class AutoMixinMeta(type):
def __call__(cls, *args, **kwargs):
try:
mixin = kwargs.pop('mixin')
name = "{}With{}".format(cls.__name__, mixin.__name__)
cls = type(name, (mixin, cls), dict(cls.__dict__))
except KeyError:
pass
return type.__call__(cls, *args, **kwargs)

class Sub(metaclass = AutoMixinMeta):
def __init__(self, name):
self.name = name

现在您可以创建 Sub 对象并指定 mixin,如下所示:

>>> s = Sub('foo', mixin=MixinOne)
>>> s.print_name()
foo is using MixinOne.

它会自动从 kwargs 字典中拉出来,这样 __init__ 方法就可以完全不知道它的存在。


注意:Python 2 中的元类声明语法略有不同:

class Sub(object):
__metaclass__ = AutoMixinMeta

def __init__(self, name):
self.name = name

关于python - 如何在实例化时有条件地将 mixin 添加到当前类中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28204130/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com