I hope you guys can help me figure this out. I have this class:
class CsvMapping:
__mapping = []
@classmethod
def initialize(cls, *args):
if not args:
raise AttributeError('No File/s Passed')
filenames = [f for f in args]
try:
for file in filenames:
with open(file, 'r') as csv_file:
fieldnames = csv_file.readline().split(',')
fieldnames = [f.strip() for f in fieldnames]
rows = csv.DictReader(csv_file, fieldnames=fieldnames)
for row in rows:
cls.__mapping.append(row)
except IOError as e:
print(strerror(e.errno))
except AttributeError:
print('No CsvFiles passed as arguments')
except Exception as e:
print(e)
@classmethod
def get_description_by_code(cls, code: str) -> str:
try:
for row in cls.__mapping:
if row['code'] == code.upper():
return row['description']
except KeyError as e:
print('Code Not Found')
Now, I have this subclass in which I recreate the class variable (which, being private, is not supposed to be inherited) __mapping and override the get_description_by_code classmethod
:
class CountryDb(CsvMapping):
__mapping = []
@classmethod
def get_description_by_code(cls, code: str) -> str:
try:
for row in cls.__mapping:
if row['code'] == code.upper():
return f"{row['description']} {row['province']}"
except KeyError as e:
print('Code Not Found')
what happens is I initialize the static class with something like this
CountryDb.initialize(STATI)
print(CountryDb.get_description_by_code('100000100'))
It does work as long as I DON'T have the method overridden. If I override the method like above, the __mapping variable of the subclass CountryDb is not used but is used to the superclass version instead. Why's that? Thank you for your help
source https://stackoverflow.com/questions/71198232/initializing-a-class-variable-in-a-subclass
Comments
Post a Comment