I find this to be more elegant. This way you encapsulate the "conversion" logic an don't need to replicate it throughout your code:
class DecimalHelper:
def __init__(self, row, column):
self.row = row
self.column = column
self.rowIndex = row - 1
self.colIndex = column - 1
row = 3
column = 4
dc = DecimalHelper(row, column)
print dc.rowIndex
print dc.colIndex
And there is an even more elegant way, using a class property (credits to this post):
class ClassPropertyDescriptor(object):
def __init__(self, fget, fset=None):
self.fget = fget
self.fset = fset
def __get__(self, obj, klass=None):
if klass is None:
klass = type(obj)
return self.fget.__get__(obj, klass)()
def __set__(self, obj, value):
if not self.fset:
raise AttributeError("can't set attribute")
type_ = type(obj)
return self.fset.__get__(obj, type_)(value)
def setter(self, func):
if not isinstance(func, (classmethod, staticmethod)):
func = classmethod(func)
self.fset = func
return self
def classproperty(func):
if not isinstance(func, (classmethod, staticmethod)):
func = classmethod(func)
return ClassPropertyDescriptor(func)
class DecimalHelper:
def __init__(self, row, column):
self.row = row
self.column = column
@classproperty
def rowIndex(cls):
return row - 1
@classproperty
def colIndex(cls):
return column - 1
row = 3
column = 4
dc = DecimalHelper(row, column)
print dc.rowIndex
print dc.colIndex