Python @property 设计

5
一个关于python @property的设计问题,我遇到了这两种选项:
选项一:
class ThisIsMyClass(object):

    @property
    def ClassAttr(self):
        ...

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

Option-2:

class ThisIsMyClass(object):

    def set_ClassAttr(self, value):
        ...

    def get_ClassAttr(self):
        ...

    myProperty = property(get_ClassAttr, set_ClassAttr)

问题:

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

如果有的话,它会如何影响我的代码?


3
从功能上看,没有什么区别......我认为现在通常更喜欢使用装饰器来实现这个功能。 - Jon Clements
3个回答

5
它们完全等效。请参阅文档以查看自己:http://docs.python.org/2/library/functions.html#property 我认为@选项更易读(代码在两个连续的行),更容易重构(搜索所有@装饰器并进行处理),更易记忆。它被设计成第二种方法的语法糖,我建议坚持使用它。 如果由于任何原因需要支持不支持@功能的Python版本(2.6),则需要坚持使用属性(第二个选项)方法。 无关的提示:建议您使用小写字母和下划线分隔的单词来命名成员属性。当然,这是一种偏好,但与Python样式建议(PEP8)相一致。有重要的例外情况,但如果可以避免,将大写字母留给类名。

@Arrieta 谢谢你提供的参考,我简直不敢相信我错过了文档中的这一行:This code is exactly equivalent to the first example,问题得到解决。顺便说一下,我是这样使用它的,因为我的 IDE 有 PEP8 的限制 :)。 - Kobi K

3
唯一的区别在于语法和使用第二种选项公开其他名称。您可以例如使用后者中的 obj.set_ClassAttr(value)
第一个选项以前无法使用,因为属性先于装饰器出现。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接