python - Two classes with a structurally identical method but one differently named variable -
i have 2 classes common function f
, here:
class classa(object): def f(self, var): self.a = g(var, self.a) # specific code classa, changing self.a class classb(object): def f(self, var): self.b = g(var, self.b) # specific code classb, changing self.b
in both classes, f
same on 2 variables called a
, b
, structurally equivalent. put f
abstract class avoid code duplication. 1 way is
class classx(object): def f(self, var): self.x = g(var, self.x) class classa(classx): # specific code classa, changing self.x class classb(classx): # specific code classb, changing self.x
in solution variables a
, b
have been renamed x
. however, make code more self-explaining, keep specific names (say a
,b
) x
in special classes.
is there way this?
also please comment if can suggest more meaningful , descriptive title, becomes more valuable community.
edit: solution should work if variables a
, b
take type pass-by-value , should assume both value , type might changed outside class during program execution.
first, caveat: if case calls inheritance of kind describe, variable name should same. in cases, giving different names attributes identical in 2 related classes doesn't make code more self-explaining -- makes less self-explaining. makes attributes different when they're same, adding complexity , potential confusion.
however, can imagine few cases might want -- sounds bit want define common interface 2 different kinds of objects. 1 simple approach use properties define aliases; in each class, you'd have different attributes (a
, b
), you'd define property, x
, access appropriate attribute in either case. in classa
, you'd in class definition:
@property def x(self): return self.a @x.setter def x(self, value): self.a = value @x.deleter def x(self): del self.a
and in classb
:
@property def x(self): return self.b @x.setter def x(self, value): self.b = value @x.deleter def x(self): del self.b
then, define common function work x
, subclasses inherit, overriding property x
in whatever way appropriate.
this rarely worth additional layer of indirection though. of time, if there's reason 2 classes share method, should share attributes method changes, name , all.
Comments
Post a Comment