pandas Python @property(setter方法),仅限于在__init__方法中设置数据

but5z9lq  于 2023-10-14  发布在  Python
关注(0)|答案(2)|浏览(98)

我想设置一个对象,在对象的初始化阶段导入一些raw_data(即在__init__()方法期间)。不过,我想从这一点开始只读它。我在考虑使用setter属性self.raw_data,逻辑如下:

@raw_data.setter
def raw_data(self, dataframe):
    <IF calling from __init__>?
        self.__raw_data = df

有没有办法让setter方法知道它是否是从__init__内部调用的?阻止所有其他更改数据的尝试。

von4xj4u

von4xj4u1#

raw_data设置器中所做的任何操作都不会停止对__raw_data的直接赋值。我建议不要定义setter,而是使用__raw_data进行初始化。这将阻止对raw_data的写入,但不会阻止对__raw_data的写入。
如果你想要更严格的执行,那么根据设计,你没有太多的选择。一个选择是用C或Cython编写类。另一个选择更容易,但它有尴尬的副作用。该选项是将不可变的内置类型(如tuple)子类化,并使用__new__创建预初始化的示例,而不是使用__init__将它们转换为初始化状态:

class Immutable(tuple):
    __slots__ = [] # Prevents creation of instance __dict__
    def __new__(cls, *whatever_args):
        attribute1 = compute_it_however()
        attribute2 = likewise()
        return super(cls, Immutable).__new__(cls, attribute1, attribute2)
    @property
    def attribute1(self):
        return self[0]
    @property
    def attribute2(self):
        return self[1]

这使得对象不可变,但尴尬的副作用是对象现在是元组。

holgip5t

holgip5t2#

你可以得到的最接近的是只允许设置self._raw_data,如果它还没有被设置,就像在这个例子中:

class Foo(object):
    def __init__(self, dataframe):
        self._raw_data = dataframe

    @property
    def raw_data(self):
         return getattr(self, '_raw_data', None)

    @raw_data.setter
    def raw_data(self, dataframe):
        if hasattr(self, '_raw_data'):
            raise AttributeError, "Attribute is read-only")
        self._raw_data = dataframe

这使得setter基本上没用,所以你会得到相同的结果,而跳过它的代码更少(这将使属性成为只读):

class Foo(object):
    def __init__(self, dataframe):
        self._raw_data = dataframe

    @property
    def raw_data(self):
         return self._raw_data

但是请注意,这些解决方案都不会阻止您直接设置_raw_data

相关问题