5

一个关于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)

问题:

我想知道使用这两个选项是否有任何区别?

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

4

3 回答 3

5

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

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

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

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

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

于 2013-11-06T15:33:13.093 回答
3

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

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

于 2013-11-06T15:19:51.217 回答
0

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
于 2020-06-07T05:11:14.370 回答