当前位置: 首页 > 面试题库 >

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

太叔鸿博
2023-03-14
问题内容

我想在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.

这可能吗?


问题答案:

使用工厂方法是解决此问题的常用方法,
尤其是 因为实例化一个类与在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


 类似资料:
  • 本节讨论了MySQL 5.1中DECIMAL数据类型(以及其同义类型)的特性,尤其是下述方面: ·数字的最大数。 ·存储格式。 ·存储要求。 ·对DECIMAL列上界 的非标准MySQL扩展。 在本节中,对于为较早MySQL版本编写的应用程序,在相应的地方指出了可能的不兼容性。 DECIMAL列的声明语法是DECIMAL(M,D)。在MySQL 5.1中,参量的取值范围如下: ·M是数字的最大数(

  • 问题内容: 在Access中(使用接近2 gb的数据库工作)的设计模式下尝试将数据类型从文本更改为数字时,我始终收到“磁盘空间不足或内存不足”的错误,因此我找到了一种解决方法,基本上是通过创建一个新列,将数据类型设置为此处的数字,将旧列的内容复制到其中,删除旧列,然后将新列重命名为旧列的名称。 我听说ALTER TABLE也可以用来更改数据类型。 有人可以给我一个示例,说明如何使用ALTER TA

  • 问题内容: 我们需要将某些列的数据类型从int更改为bigint。不幸的是,其中一些表很大,大约有7-10百万行(但不宽)。 Alter表alter列将永远保留在这些表上。有没有更快的方法来实现这一目标? 问题答案: 巧合的是,大约3个小时前,我不得不做一些非常相似的事情。该表是3500万行,它相当宽,并且花了很多时间才能做到这一点: 这就是我最终得到的结果: 这次,这些陈述几乎是即时的。(在速度

  • 问题内容: 我想将表示为列表列表的表转换为。作为一个极其简化的示例: 将列转换为适当类型的最佳方法是什么(在这种情况下,将列2和3转换为浮点数)?有没有一种方法可以在转换为DataFrame时指定类型?还是先创建DataFrame然后遍历各列以更改各列的类型更好?理想情况下,我想以动态方式执行此操作,因为可以有数百个列,并且我不想确切指定哪些列属于哪种类型。我可以保证的是,每一列都包含相同类型的值

  • 本文向大家介绍更改给定numpy数组的数据类型,包括了更改给定numpy数组的数据类型的使用技巧和注意事项,需要的朋友参考一下 除了python的本机数据类型外,Numpy数组还支持多种数据类型。创建数组后,我们仍然可以根据需要修改数组中元素的数据类型。用于此目的的两种方法是array.dtype和array.astype array.dtype 此方法为我们提供了数组中元素的现有数据类型。在下面

  • 我希望用户能够手动输入将保存到数据库的日期。我的MonthType看起来像: 我的控制器看起来像: 在存储库中,我有: 当我试图保存记录我得到一个错误:一个异常发生在执行'插入到月份(名称,日期开始,日期结束,upper_limit,user_id,保留)值 (?, ?, ?, ?, ?, ?)'使用参数["2012年6月",{"date":"2012-06-01 00:00:00.000000"