小编典典

插入数据后更改类的类类型

python

我想在python中创建一个类,它应该像这样工作:

  1. 分配的数据,可能绑定到变量(例如a = exampleclass(data)exampleclass(data)

  2. 插入数据后,它应自动确定数据的某些属性,如果某些属性被填充,它将自动…

  3. …将班级改为另一个班级

第三部分是我有问题的部分。我如何真正改变班级内部的班级?例如:

如果我有两个班级,一个是Small_Numbers,另一个是Big_numbers;现在我希望将small_number小于1000的任何内容转换为a
Big_number,反之亦然,测试代码:

a = Small_number(50)
type(a) # should return Small_number.
b = Small_number(234234)
type(b) # should return Big_number.
c = Big_number(2)
type(c) # should return Small_number.

这可能吗?


阅读 132

收藏
2020-12-20

共1个答案

小编典典

使用工厂方法是解决此问题的常用方法,
尤其是 因为实例化一个类与在Python中调用一个函数没有区别。

但是,如果您 确实 需要,可以分配给self.__class__

THRESHOLD = 1000

class Small(object):
    def __init__(self, n):
        if n < THRESHOLD:
            self.n = n
        else:
            self.__class__ = Big
            self.__init__(n)

class Big(object):
    def __init__(self, n):
        if n < THRESHOLD:
            self.__class__ = Small
            self.__init__(n)
        else:
            self.n = n

这按预期工作:

>>> a = Small(100)
>>> type(a)
<class 'Small'>
>>> b = Small(1234)
>>> type(b)
<class 'Big'>
>>> c = Big(2)
>>> type(c)
<class 'Small'>

如果分配给您self.__class__似乎太奇怪了,则可以改写__new__。该方法在调用之前__init__被调用,它可以用来选择要实例化的类:

THRESHOLD = 1000

class Switcher(object):
    def __new__(cls, n):
        if n < THRESHOLD:
            new_cls = Small
        else:
            new_cls = Big
        instance = super(Switcher, new_cls).__new__(new_cls, n)
        if new_cls != cls:
            instance.__init__(n)
        return instance

class Small(Switcher):
    def __init__(self, n):
        self.n = n

class Big(Switcher):
    def __init__(self, n):
        self.n = n
2020-12-20