请考虑以下最小问题:
from math import sqrt
class Vector(object):
def __init__(self, x, y, z):
self.v = [x, y, z]
def normalize(self):
x, y, z = self.v
norm = sqrt(x**2 + y**2 + z**2)
self.v = [x/norm, y/norm, z/norm]
# other methods follow
class NormalizedVector(Vector):
def __init__(self, x, y, z):
super(Vector, self).__init__(x, y, z)
self.normalize()
因此,基本上NormalizedVector对象与Vector对象相同,但具有附加的规范化.
是否可以在Vector中添加一个方法,以便每当调用normalize方法时,该对象都会自动子类化为NormalizedVector?
我知道我可能会使用abstract factory pattern,但这仅在对象在创建时被子类化的情况下才有效:我希望能够对先前已经创建的对象进行子类化.
基于重新分配__类__方法,我发现了some solutions,但是不鼓励这样做.我愿意将上述模式修改为更“ Pythonic”的模式.
解决方法:
我建议仅使用Vector()类,并使用布尔标准化实例属性.
同样,在归一化方法中,您使用的是x,y和z,但未定义这些变量,甚至都不用self读取它们.
我建议的代码:
from math import sqrt
class Vector(object):
def __init__(self, x, y, z, normalized=False):
self.v = [x, y, z]
if normalized in [True, False]:
self.normalized = normalized
else:
raise Exception("Please set normalized to either True or False")
def __repr__(self):
return "Vector ({}, {}, {})".format(*self.v)
def normalize(self):
x,y,z = self.v
norm = sqrt(x**2 + y**2 + z**2)
self.v = [x/norm, y/norm, z/norm]
self.normalized = True
def isNormalized(self):
return self.normalized
# other methods follow
v1 = Vector(10, 20, 30)
print v1.isNormalized()
v1.normalize()
print v1.isNormalized()
v2 = Vector(40, 50, 60, normalized=True)
print v2.isNormalized()
输出:
False
True
True
__repr__函数将很好地展示您的对象:
print v1
输出:
Vector (0.267261241912, 0.534522483825, 0.801783725737)