【问题标题】:Custom property setter / getter in PythonPython中的自定义属性设置器/获取器
【发布时间】:2020-05-15 18:50:13
【问题描述】:

我确实有一个“联系人”类,我可以从客户数据库中的一个联系人那里获取所有字段。属性键不是动态的;可以是硬编码的。 两个访问属性,我需要客户 getter 和 setter; getter 会格式化输出,例如日期格式、货币、...以及设置器,例如当您设置日期时间时,如果转换为数据库的 UNIX 时间戳。

另外,我需要这些属性可用于在我的 IDE 中自动完成,不喜欢手动编写属性名称,因为我通常会用拼写错误将它们搞砸。所以我认为它们要么需要是一个属性,要么是一个函数。

我找到的解决方案是很多行代码:

class Contact(Dict):

    def __init__(self, values: Dict = {}):
        self.values = values

    get_email(self):
        return self.values('email')

    set_email(self, value):
        self.values['email'] = value

    get_create_date(self):
        d = self.values.get('create_date', None)
        if d:
            return d.strftime('%Y-%m-%d')
        else:
            return None

    set_create_date(self, value):
        self.values['create_date'] = value

    get_price(self):
        p = self.values.get('price', None)
        if d:
            return "{:,}.-".format(p)
        else:
            return None

【问题讨论】:

    标签: python properties


    【解决方案1】:

    我认为没有理由使用单独的 getter 和 setter,也没有理由存储 values 而不是存储来自 dict 的单个元素。

    class Contact:
        def __init__(self, values):
            self.email = values['email']
            d = values.get('create_date')
            if d is not None:
                d = d.strftime('%Y-%m-%d')
            self.create_date = d
            p = values.get('price')
            if p is not None:
                p = '{:,}.-'.format(p)
            self._price = p
    
        @property
        def price(self):
            return self._price
    

    您的 setter 没有进行任何验证,因此您可以直接分配给 self.emailself.create_date。由于您没有price setter,我将其设置为没有 setter 的属性,以便您可以检索价格但不设置它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-06
      • 1970-01-01
      • 1970-01-01
      • 2014-07-24
      • 2013-04-13
      相关资源
      最近更新 更多