在 Python 中定义属性的首选方式:属性装饰器还是 lambda?

发布于 2024-08-24 04:48:22 字数 238 浏览 2 评论 0原文

在 Python 中定义类属性的首选方法是什么?为什么?在一堂课中同时使用两者可以吗?

@property
def total(self):
    return self.field_1 + self.field_2

或者

total = property(lambda self: self.field_1 + self.field_2)

Which is the preferred way of defining class properties in Python and why? Is it Ok to use both in one class?

@property
def total(self):
    return self.field_1 + self.field_2

or

total = property(lambda self: self.field_1 + self.field_2)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

贵在坚持 2024-08-31 04:48:22

对于只读属性,我使用装饰器,否则我通常会执行以下操作:

class Bla(object):
    def sneaky():
        def fget(self):
            return self._sneaky
        def fset(self, value):
            self._sneaky = value
        return locals()
    sneaky = property(**sneaky())

更新:

最近版本的 python 增强了装饰器方法:

class Bla(object):
    @property
    def elegant(self):
        return self._elegant

    @elegant.setter
    def elegant(self, value):
        self._elegant = value

For read-only properties I use the decorator, else I usually do something like this:

class Bla(object):
    def sneaky():
        def fget(self):
            return self._sneaky
        def fset(self, value):
            self._sneaky = value
        return locals()
    sneaky = property(**sneaky())

update:

Recent versions of python enhanced the decorator approach:

class Bla(object):
    @property
    def elegant(self):
        return self._elegant

    @elegant.setter
    def elegant(self, value):
        self._elegant = value
爱情眠于流年 2024-08-31 04:48:22

在您所展示的情况下,装饰器形式可能是最好的,您希望将方法转换为只读属性。当您想要提供 setter/deleter/docstring 以及 getter 时,或者如果您想要添加一个与其派生其值的方法具有不同名称的属性时,第二种情况会更好。

The decorator form is probably best in the case you've shown, where you want to turn the method into a read-only property. The second case is better when you want to provide a setter/deleter/docstring as well as the getter or if you want to add a property that has a different name to the method it derives its value from.

烟柳画桥 2024-08-31 04:48:22

不要为此使用 lambda。第一个对于只读属性是可接受的,第二个与真实方法一起用于更复杂的情况。

Don't use lambdas for this. The first is acceptable for a read-only property, the second is used with real methods for more complex cases.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文