【问题标题】:Python - @property vs func() [closed]Python - @property 与 func() [关闭]
【发布时间】:2013-10-26 14:52:52
【问题描述】:

使用someclass.func 而不是someclass.func() 一直是我的梦想。我读到了@decorators。现在我问:

哪种方式更好?

方式 1

class Main(object):

    def __init__(self):

        self.func()

    def func(self):

        print 'hi'

或者...

方式 2

class Main(object):

    def __init__(self):

        self.func

    @property
    def func(self):

        print 'hi'

编辑

代码如下: http://randomgalaxy.com/stackoverflow/python-property-vs-func/term.py

【问题讨论】:

  • 取决于你希望 func() 以后用于什么。
  • 这是一个你想要呈现什么API的问题,这完全取决于你的应用和需求。没有上下文,这是无法回答的。
  • @ChristianTernus,我正在使用 wxPython 编写一个 GUI 应用程序。此功能将在我的 StyledTextCtrl 中刷新样式

标签: python function properties


【解决方案1】:

如果func 真的打印 值,那么不,将其作为属性是不正确的做法。属性——顾名思义——是附加到对象的值。因此,带有 @property 装饰器的函数应该返回一个值,否则没有副作用。

【讨论】:

  • 所以在那里做其他事情是个坏主意吗?我的意思是在我的脚本函数中更改我的变量并调用另一个函数
  • 是的,这是个坏主意。对象 state 不应从简单地访问属性并读取其值而改变。例如,在短时间内多次访问x.func 应该没有问题,它作为一个属性表明这绝对没问题。如果该函数实际上对对象做了某事,则将其保留为方法。
  • 我有点不同意,你可以使用@property 来实现一个记忆模式并做一些缓存。这不是公共状态更改,但仍然是状态更改。
【解决方案2】:

属性应该是。不是函数。
示例:

class Foo(object):
    def __init__(self, a, b):
        self.__a = a
        self.__b = b

    @property
    def a(self):
        return self.__a

    @property
    def b(self):
        return self.__b

在此示例中,值是私有,您无法更改它们。

所以在那里做其他事情是个坏主意吗?我的意思是在我的脚本函数中更改了我的变量并调用了另一个函数 – Vik2015 45 秒前

这是非常糟糕的风格。你不在红宝石中:)

【讨论】:

  • 感谢您的回答。我会接受@poke的回答,因为他解释得更好:)
  • @user2892431 ruby​​ 是否有一些策略来处理这种风格不错的情况?
【解决方案3】:

编辑:在阅读您的实际代码后,绝对是方式 1

最有可能:方式 1

但这取决于您实际尝试做什么。你提出的这个案例过于简单了。

根据我的经验,使用@property 装饰器是一种保护类成员的方法(仅允许读取),一种在设置/读取变量时进行一些记账的方法,或者一种提供对成员的访问权限的方法- like 函数(即,只返回您请求的值,即使它需要一些额外的计算才能获得该值)。我个人喜欢用它来做惰性求值

【讨论】:

    猜你喜欢
    • 2021-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多