【问题标题】:Python @property designPython @property 设计
【发布时间】:2013-11-17 21:43:05
【问题描述】:

一个关于python@property的设计问题,我遇到过这两个选项:

选项 1:

class ThisIsMyClass(object):

    @property
    def ClassAttr(self):
        ...

    @ClassAttr.setter
    def ClassAttr(self, value):
        ...

选项 2:

class ThisIsMyClass(object):

    def set_ClassAttr(self, value):
        ...

    def get_ClassAttr(self):
        ...

    myProperty = property(get_ClassAttr, set_ClassAttr)

问题:

我想知道使用这两个选项有什么不同吗?

如果是这样,它对我的​​代码有何影响?

【问题讨论】:

  • 在功能上 - 没有区别......我相信这些天在风格上通常首选使用装饰器

标签: python properties


【解决方案1】:

唯一的区别是语法和使用第二个选项公开其他名称。例如,您可以将obj.set_ClassAttr(value) 与后者一起使用。

第一个选项过去不可用,因为属性早于装饰器。

【讨论】:

    【解决方案2】:

    它们是完全等价的。请参阅文档以自己查看:

    http://docs.python.org/2/library/functions.html#property

    在我看来,@ 选项更具可读性(两行连续的代码),更易于重构(所有 @ 装饰器的 grep 并继续),并且更容易记住。它是第二种方法的语法糖,我建议坚持下去。

    如果出于任何原因您需要支持不支持 @ 功能的 Python 版本(2.6),那么您需要坚持使用属性(第二种选择)方法。

    在不相关的说明中:我建议您保留使用小写单词命名的成员属性,并用下划线分隔。当然,这是一个偏好问题,但与 Python 风格推荐 (PEP8) 一致。这个建议有一些重要的例外,但如果你能提供帮助,请为类名保留大写字母。

    【讨论】:

    • @Arrieta 感谢您的参考,我不敢相信我错过了文档中的这一行:This code is exactly equivalent to the first example,它解决了这个问题。对于注释,我以这种方式使用它,IDE 有 PEP8 限制:)。
    【解决方案3】:

    property() 是 Python 中的内置函数,为实例属性提供接口。它封装实例属性并提供属性,与Java和C#相同。 property() 方法接受 get、set 和 delete 方法作为参数,并返回属性类的对象。

    • 我们甚至不能定义名称 get_method 和 set_method,因为它们 是不必要的,会污染类命名空间。

    • 用于定义属性的语法非常简洁易读。

    为了更好地理解,请阅读以下示例。

    @property 装饰器示例

    class ThisIsMyClass:
        def __init__(self, grade=None):
            self.grade = grade
    
        @property
        def student_grade(self):
            return self.grade
    
        @student_grade.setter
        def student_grade(self, grade):
            self.grade = grade
    
        @student_grade.deleter
        def student_grade(self):
            print("This is a delete method")
            self.grade = 0
    
    
    property_obj = ThisIsMyClass(80)
    
    print(property_obj.student_grade)
    
    property_obj.student_grade = 70
    
    print(property_obj.student_grade)
    
    del property_obj.student_grade
    
    print(property_obj.student_grade)
    

    输出:

    80
    70
    This is a delete method
    0
    

    没有@property 装饰器的示例

    class ThisIsMyClass:
        def __init__(self, grade=None):
            self.grade = grade
    
        def get_student_grade(self):
            return self.grade
    
        def set_student_grade(self, grade):
            self.grade = grade
    
        def delete_student_grade(self):
            print("This is a delete method")
            self.grade = 0
    
    
    property_obj = ThisIsMyClass(80)
    
    print(property_obj.get_student_grade())
    
    property_obj.set_student_grade(70)
    
    print(property_obj.get_student_grade())
    
    property_obj.delete_student_grade()
    
    print(property_obj.get_student_grade())
    

    输出:

    80
    70
    This is a delete method
    0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-02
      • 2021-05-27
      • 2021-04-14
      • 2010-11-23
      • 2018-11-23
      • 2012-09-06
      • 2021-06-28
      • 2021-07-21
      相关资源
      最近更新 更多