Python 抽象 setter 和 getter

Posted

技术标签:

【中文标题】Python 抽象 setter 和 getter【英文标题】:Python abstract setters and getters 【发布时间】:2019-04-30 23:22:11 【问题描述】:

我想编写抽象类来强制继承类在我的抽象类中实现所有方法和属性。

此外,我想为我的抽象属性使用 setter 和 getter,以使我的代码整洁且美观

但是,当前的实现:

import abc


class Component(metaclass=abc.ABCMeta):

    @property
    @abc.abstractmethod
    def status(self):
        pass

    @property
    @status.setter
    @abc.abstractmethod
    def status(self, value):
        pass

确实强制继承类为我的抽象属性 getter 实现 getter,但不强制创建属性 setter(这正是我想要的)

如何在不失去应用进一步提到的方法(也就是编写新方法并在我的抽象类设置器中执行它们)的所有好处的情况下实现此行为?

【问题讨论】:

【参考方案1】:

从 abc 导入 ABCMeta,抽象方法

类基(对象): 元类 = ABCMeta

def __init__(self, val):
    self._foo = val

@abstractmethod
def _doStuff(self, signals):
    print ('Base does stuff')

@abstractmethod
def _get_foo(self):
    return self._foo

@abstractmethod
def _set_foo(self, val):
    self._foo = val + 'r'

foo = property(_get_foo, _set_foo)

类 floor_1(基础): 元类 = ABCMeta

def __init__(self, val):
    self._foo = val
    super(floor_1, self).__init__(val)

def _doStuff(self, signals):
    print ('floor_1 does stuff')

def _get_foo(self):
    return self._foo

def _set_foo(self, val):
    #self._foo = val + 'r'
    super()._set_foo(val + 'r')

foo = property(_get_foo, _set_foo)

class floor_2(floor_1):

@property
def foo(self):
    return self._foo

@foo.setter
def foo(self, val):
    self._foo = val + 'r'
    #super()._set_foo(val + 'r')

b1 = floor_1('bar')

b1 = floor_2('bar')

打印(b1.foo) b1.foo = '酒吧' 打印(b1.foo)

【讨论】:

以上是关于Python 抽象 setter 和 getter的主要内容,如果未能解决你的问题,请参考以下文章

具有公共getter的抽象属性,可以在具体类中定义私有setter吗?

Python中的setter和getter

Python使用@property装饰器--getter和setter方法变成属性

Python的property _getter和setter方法

Python 类@property:使用setter 但避开getter?

在Python中覆盖继承属性的getter和setter