【问题标题】:Python: for multiple properties use one getter and setter methodPython:对于多个属性,使用一种 getter 和 setter 方法
【发布时间】:2020-07-28 04:56:39
【问题描述】:

我创建了一个具有多个属性的类。我想将一个函数用于 getter 方法,将第二个函数用于 setter 方法。

class person:

    def __init__(self, fname, lname, city, state):
        # make all attributes as private
        self._fname = fname
        self._lname = lname
        self._city = city
        self._state = state

    @property  # get method
    def fname(self):
        return self._fname

    @fname.setter  # set method
    def fname(self,fname):
        self._fname = fname

    @property
    def lname(self):
        return self._lname

    @lname.setter
    def lname(self,lname):
        self._lname = lname

    @property
    def city(self):
        return self._city

    @city.setter
    def city(self, city):
        self._city = city

    @property
    def state(self):
        return self._state

    @state.setter
    def state(self, state):
        self._state = state  

一种get方法和一种set方法如何使用所有属性?

例如:

def get(self):
    return self._attr

def set(self,value):
    self._attr = value

【问题讨论】:

  • 你可以写一个自定义的descriptor,然后做例如city = my_descriptor('_city')。这是我之前评论过的一个:codereview.stackexchange.com/q/98892/32391。但在这个例子中,这些东西都是属性没有意义,因为 getter 和 setter 不任何事情。
  • 拥有计算属性的要点是当您不需要它们时不必编写 getter/setter - 在您的示例中绝对不需要它们。所以只需删除所有这些属性,改用普通的公共属性(这将在功能上 100% 等效,没有描述符和方法调用的开销),如果/当你发现你需要为一个添加一些有效的 getter/setter给定属性,把它(和它单独)变成一个属性(或任何自定义描述符)。

标签: python-3.x oop getter-setter python-class


【解决方案1】:
class person:
    def __set_name__(self, name):
        self.name = name

    def __get__(self, obj, type=None) -> object:
        return obj.__dict__.get(self.name)

    def __set__(self, obj, value) -> None:
        obj.__dict__[self.name] = value

my_value = person
my_values.fname = 'Shivam'
my_values.lname = 'Gupta'

print(my_values.fname)  #--> Shivam
print(my_values.lname)  #--> Gupta

【讨论】:

    猜你喜欢
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 2015-04-25
    • 1970-01-01
    • 2019-05-09
    • 2021-12-02
    • 1970-01-01
    相关资源
    最近更新 更多