python抽象属性setter与混凝土吸气剂

时间:2016-02-11 16:05:17

标签: python

是否可以使用using ExamResultMap = MapOfMaps<Student, Exam, Result>; 来创建具体的getter,但是使setter抽象,以使每个继承类的不同。我为每个子类处理val的设置。

例如

template <typename Key1, typename Key2, typename T>
class MatrixMap
{
    std::vector<Key2> key2s_;
    std::unordered_map<Key1, std::vector<T>> values_;
    std::unordered_map<std::reference_wrapper<const Key2>, std::size_t> key2_indicies_;
public:
    // API
};

3 个答案:

答案 0 :(得分:9)

你需要一点间接。像往常一样定义setter,但让它调用一个执行实际工作的抽象方法。然后每个子类都需要提供那个方法的定义。例如,

class Base(object):
    __metaclass__ = abc.ABCMeta

    def __init__(self):
        self._val = 3

    @property
    def val(self):
        return self._val

    @val.setter
    def val(self, x):
        self._val_setter(x)

    @abc.abstractmethod
    def _val_setter(self, x):
        pass


class Child(Base):

    def _val_setter(self, x):
        self._val = 2*x

然后

>>> c = Child()
>>> print c.val
3
>>> c.val = 9
>>> print c.val
18

答案 1 :(得分:5)

我最终是怎么做到的。

class C(metaclass=ABCMeta):
    @property
    def x(self):
        ...

    @x.setter
    @abstractmethod
    def x(self, val):
        ...

class D(C):
    @C.x.setter
    def x(self, val):
        ...

答案 2 :(得分:0)

df_schema = sqlContext.read.format('com.databricks.spark.xml').options(rowTag='<xml_tag_name>').load(schema_path)