在Python中将对象从类转换为子类的方法

请考虑以下最小问题:

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)
上一篇:Inheritance Learning Note


下一篇:centos 中端口被占用的情况