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

时间:2012-02-04 19:44:55

标签: python class python-3.x

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

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

  2. 插入数据后,它应自动确定数据的某些属性,如果某些属性已满,则会自动...

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

  4. 第3部分是我遇到问题的部分。我如何真正改变班级内的课程?例如:

    如果我有两个班级,一个是Small_Numbers,另一个是Big_numbers;现在我希望任何小于1000的small_number转移到Big_number,反之亦然,testcode:

    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.
    

    这可能吗?

3 个答案:

答案 0 :(得分:13)

为什么不使用工厂方法?这个将根据传递的数据决定实例化哪个类。使用您的示例:

def create_number(number):
    if number < 1000:
        return SmallNumber(number)
    return BigNumber(number)

答案 1 :(得分:9)

别。改为使用工厂功能。

def create_number(source):
    if source < 1000:
       return Small_number(source)
    else:
       return Big_number(source)

a = create_number(50)
b = create_number(234234)
c = create_number(2)

答案 2 :(得分:8)

使用factory method是解决此问题的常用方法,尤其是,因为实例化一个类与在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__似乎太奇怪了,那么请you can override __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