我想在python中创建一个类,它应该像这样工作:
分配的数据,可能绑定到变量(例如a = exampleclass(data)或exampleclass(data))
a = exampleclass(data)
exampleclass(data)
插入数据后,它应自动确定数据的某些属性,如果某些属性被填充,它将自动…
…将班级改为另一个班级
第三部分是我有问题的部分。我如何真正改变班级内部的班级?例如:
如果我有两个班级,一个是Small_Numbers,另一个是Big_numbers;现在我希望将small_number小于1000的任何内容转换为a Big_number,反之亦然,测试代码:
Small_Numbers
Big_numbers
small_number
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__:
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__被调用,它可以用来选择要实例化的类:
__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