my question twofold. first, define class having 1 method scale behaves differently depending on value assigned 1 of properties. below current attempt xxx signling parts of code missing.
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 'double'." # xxx method scale should set double elif value.lower() == "same": self._scaling_method = "same" print "scaling method set 'same'." # xxx method scale should set same else: print "unknown scaling method." if c instance of c,i want able
c.same(3) # yields 3 c.double(3) # yields 6 c.scale(3) # yields 3 because scale defaults same c.scaling_method = "double" c.scale(3) # yields 6 once correctly set up, able set scaling_method property argument , define scale method accordingly in __init__. now, solution see second part define each scaling method both in core of class , in __init__ section, seems pretty awkward.
edit: noticed this answer may adapted here.
as commented, not clear if want on class basis or instance basis. here solution work on instance basis. overload scale method:
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." if want on class basis, replace self.scale = ... self.__class__.scale = .... note: considered hacky because i'm changing class.
then
sage: c = c() sage: c.scale(3) 3 sage: c.scaling_method = "double" sage: c.scale(3) 6 note other objects of class not affected:
sage: cc = c() sage: cc.scale(4) 8 if want have same behavior on class basis:
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." then in previous code:
sage: c = c(); cc = c() sage: c.scale(2), cc.scale(3) (2, 3) sage: c.scaling_method = "double" sage: c.scale(2) 4 but cc affected too:
sage: cc.scale(3) 6
Comments
Post a Comment