我想在python中创建一个类,它应该像这样工作:
分配的数据,可能绑定到变量(例如a = exampleclass(data)
或仅exampleclass(data)
)
插入数据后,它应自动确定数据的某些属性,如果某些属性已满,则会自动...
...将班级改为另一班级
第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.
这可能吗?
答案 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