Python-@property vs func()

Python-@property vs func(),python,function,properties,Python,Function,Properties,使用someclass.func而不是someclass.func()一直是我的梦想。我读到了@decorators。现在我要问: 哪条路更好 方式1 或者 方式2 编辑 代码如下: 如果func确实打印值,那么不,将其作为属性不是正确的做法。属性的名称表示附着到对象的值。因此,具有@属性的函数装饰器应该只返回一个值,否则没有副作用。如果func确实打印值,那么不,将其作为属性不是正确的做法。属性的名称表示附着到对象的值。因此,具有@属性的函数应该只返回一个值,否则没有副作用。属性应该是值。不

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

哪条路更好

方式1 或者

方式2
编辑 代码如下:

如果
func
确实打印值,那么不,将其作为属性不是正确的做法。属性的名称表示附着到对象的值。因此,具有
@属性的函数
装饰器应该只返回一个值,否则没有副作用。

如果
func
确实打印值,那么不,将其作为属性不是正确的做法。属性的名称表示附着到对象的值。因此,具有
@属性的函数应该只返回一个值,否则没有副作用。

属性应该是值。不是功能。
例如:

在本例中,值是私有的,不能更改


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


这是非常糟糕的风格。您没有使用ruby:)

属性应该是值。不是功能。
例如:

在本例中,值是私有的,不能更改


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


这是非常糟糕的风格。您不在ruby中:)

编辑:在阅读实际代码后,请务必按第一种方式

最有可能的:方式1

但这取决于你真正想做什么。你提出的这个案例过于简单化了


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

编辑:在阅读实际代码之后

最有可能的:方式1

但这取决于你真正想做什么。你提出的这个案例过于简单化了


根据我的经验,使用@property decorator是一种保护类成员的方法(仅允许读取)、一种在设置/读取变量时进行簿记的方法,或者一种提供对类成员函数的访问的方法(即,仅返回您请求的值,即使它需要一些额外的计算才能获得该值)。我个人喜欢将其用于延迟计算

取决于您希望func()以后用于什么。这是一个您希望呈现什么API的问题,这完全取决于您的应用程序和需求。如果没有上下文,这是无法回答的。@ChristianTernus,我正在使用wxPython编写GUI应用程序。此函数将刷新my StyledTextCtrlDepends中的样式设置,具体取决于您希望func()以后用于什么。这是一个您希望呈现什么API的问题,这完全取决于您的应用程序和需要。如果没有上下文,这是无法回答的。@ChristianTernus,我正在使用wxPython编写GUI应用程序。此函数将刷新我的StyledTextCtrl中的样式,因此在那里执行其他操作不是一个好主意吗?我的意思是,在我的脚本中,函数改变我的变量并调用另一个函数,这是个坏主意。对象状态不应该从简单地访问属性和读取属性值改变。例如,在短时间内多次访问
x.func
应该没有问题,而且它是一个属性,这表明这是绝对正确的。如果这个函数确实对对象做了一些事情,那么就把它保留为一个方法。我有一点不同意,你可以使用
@property
来实现一个memmoized模式并进行一些缓存。这不是一个公共状态的改变,但它仍然是一个状态的改变。所以在那里做其他事情是个坏主意?我的意思是,在我的脚本中,函数改变我的变量并调用另一个函数,这是个坏主意。对象状态不应该从简单地访问属性和读取属性值改变。例如,在短时间内多次访问
x.func
应该没有问题,而且它是一个属性,这表明这是绝对正确的。如果这个函数确实对对象做了一些事情,那么就把它保留为一个方法。我有一点不同意,你可以使用
@property
来实现一个memmoized模式并进行一些缓存。这不是一个公共状态的改变,但仍然是一个状态的改变。谢谢你的回答。我会接受@poke answer,因为他解释得稍微好一点:)@user2892431 ruby有什么策略来处理这种风格不错的情况吗?谢谢你的回答。我会接受@poke answer,因为他解释得稍微好一点:)@user2892431 ruby是否有一些策略来处理这种风格不错的情况?
class Main(object):

    def __init__(self):

        self.func()

    def func(self):

        print 'hi'
class Main(object):

    def __init__(self):

        self.func

    @property
    def func(self):

        print 'hi'
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