我有一个抽象类Reader
,它定义了一个reader
方法,该方法将实现每个继承的类。我想做的是在_is_valid
方法的每个实现的开始处执行reader
方法,但是我不想不必在每个类中重复代码或使用装饰器。
import os
from abc import ABCMeta, abstractmethod
import pandas as pd
class Reader(ABCMeta):
@abstractmethod
def read(cls, f):
raise NotImplementedError
@staticmethod
def _valid(f):
return os.path.exists(f)
class CSVReader(Reader):
def read(self, f):
if not self._valid(f):
return None
else:
return pd.read_csv(f).values
class XLSReader(Reader):
def read(self, f):
pass
class SHPReader(Reader):
def read(self, f):
pass
任何想法都可以解决的最佳方法是什么?
答案 0 :(得分:4)
您的Reader
类可以具有一个公共方法read
,该方法定义先调用_valid
然后调用_read
from abc import ABC, abstractmethod
class Reader(ABC): # Or metaclass=ABCMeta
def read(self, f):
if not self._valid(f):
raise ValueError("Invalid")
else:
return self._read(f)
@abstractmethod
def _read(self, f)
raise NotImplementedError
@classmethod
def _valid(cls, f) # Subclasses can have more restrictive validations
return os.path.exists(f)