1

我的问题是双重的。首先,我想定义一个类,它有一个方法scale,该方法的行为取决于分配给它的一个属性的值。下面是我目前对XXX缺少某些代码的部分进行签名的尝试。

class C(object):
    def __init__(self):
        self._scaling_method = None

    def same(self, u):
        return u

    def double(self, u):
        return u * 2

    scale = same

    @property
    def scaling_method(self):
        return self._scaling_method

    @scaling_method.setter
    def scaling_method(self, value):
        if value.lower() == "double":
            self._scaling_method = "double"
            print "Scaling method set to 'double'."
            # XXX method scale should be set to double
        elif value.lower() == "same":
            self._scaling_method = "same"
            print "Scaling method set to 'same'."
            # XXX method scale should be set to same
        else:
            print "Unknown scaling method."

如果c是一个实例C,我希望能够做到

c.same(3) # yields 3
c.double(3) # yields 6
c.scale(3) # yields 3 because scale defaults to same
c.scaling_method = "double"
c.scale(3) # yields 6

一旦正确设置,我希望能够scaling_method使用参数设置属性并scale__init__. 目前,我在第二部分看到的唯一解决方案是在类的核心和部分中定义每个缩放方法__init__,这看起来很尴尬。

编辑:我刚刚注意到这个答案可能会在这里调整。

4

2 回答 2

2

正如所评论的,尚不清楚您是要以类为基础还是以实例为基础。这是一个基于实例的解决方案。我重载了 scale 方法:

class C(object):
    def __init__(self):
        self._scaling_method = None

    def same(self, u):
        return u

    def double(self, u):
        return u * 2

    scale = same

    @property
    def scaling_method(self):
        return self._scaling_method

    @scaling_method.setter
    def scaling_method(self, value):
        if value.lower() == "double":
            self._scaling_method = "double"
            self.scale = self.double
        elif value.lower() == "same":
            self._scaling_method = "same"
            self.scale = self.same
        else:
            print "Unknown scaling method."

如果您希望以班级为基础,请替换self.scale = ...self.__class__.scale = .... 注意:这可能被认为是hacky,因为我真的在改变班级。

然后

sage: c = C()
sage: c.scale(3)
3
sage: c.scaling_method = "double"
sage: c.scale(3)
6

请注意,该类的其他对象不受影响:

sage: cc = C()
sage: cc.scale(4)
8

如果您想在类的基础上具有相同的行为:

class C(object):
    _scaling_method = None

    def same(self, u):
        return u

    def double(self, u):
        return u * 2

    scale = same

    @property
    def scaling_method(self):
        return self._scaling_method

    @scaling_method.setter
    def scaling_method(self, value):
        if value.lower() == "double":
            self.__class__._scaling_method = "double"
            self.__class__.scale = self.double
        elif value.lower() == "same":
            self.__class___.scaling_method = "same"
            self.__class__.scale = self.same
        else:
            print "Unknown scaling method."

然后和前面的代码一样:

sage: c = C(); cc = C()
sage: c.scale(2), cc.scale(3)
(2, 3)
sage: c.scaling_method = "double"
sage: c.scale(2)
4

但现在cc也受到影响:

sage: cc.scale(3)
6
于 2013-07-15T09:47:02.373 回答
0

这是我从这个答案中得出的解决方案。这些print语句可以替换为适当的错误处理。

class C(object):
    def __init__(self, scaling_method="same"):
        self._list_scaling_methods = ("same", "double")
        if scaling_method in self._list_scaling_methods:
            self._scaling_method = scaling_method
        else:
            print "Unknown scaling method."
            self._scaling_method = None

    @property
    def scaling_method(self):
        return self._scaling_method

    @scaling_method.setter
    def scaling_method(self, value):
        if value in self._list_scaling_methods:
            self._scaling_method = value
        else:
            print "Unknown scaling method."

    @property
    def scale(self):
        return getattr(self, self._scaling_method)

    def same(self, u):
        return u

    def double(self, u):
        return u * 2
于 2013-07-15T11:08:52.503 回答