【问题标题】:Python Object Oriented Design; Return, Set Instance Variable Or BothPython 面向对象设计;返回、设置实例变量或两者兼而有之
【发布时间】:2010-08-11 20:42:35
【问题描述】:

好的,我有一些代码可以归结为这样的模式

class Foo(object):
def get_something1(self):
    # in the actual code it asks a web server but here I replaced that with "foo_something1" instead of the code from a web server
    self.something1 = "foo_something1"

def get_something2(self):
    # needs the result of get_something1; right now I have it get it by instance variable like so
    self.something2 = self.something1 + "_something_2"

我的问题是,我应该执行上述操作(通过实例变量获取所需的方法)还是采用这样的参数;我还应该在 get_* 方法中返回 something1 和 something2 吗?

class Foo(object):
def get_something1(self):
    # in the actual code it asks a web server but here I replaced that with "foo_something1" instead of the code from a web server
    self.something1 = "foo_something1"

def get_something2(self, something_1):
    # needs the result of get_something1; right now I have it get it by instance variable like so
    self.something2 = something1 + "_something_2"

现在在我的代码中,方法返回延迟(扭曲);现在,当延迟触发时,它会设置实例变量并返回 None;在实际代码中,我有另一个函数来检查 something1 或 something2 是否已过期;我更新它们会带来一个问题,因为我更新它是这样的......

d = self.get_something1()
##d.addCallback(self.get_something2) # errors because it gets the argument None (so I do below)
d.addCallback(lambda ignored: self.get_something2())# problem the deferred for get_something2 is inaccessible

所以现在更新代码要么丑陋,要么充满错误,要么两者兼而有之。所以我有一种感觉,我正在做某事a)un pythonic或b)un twisted或c)其他一些糟糕的设计。


感谢您的回答,但这些不起作用,因为函数返回延迟而不是实际值(否则它将不得不阻塞)。

【问题讨论】:

  • 由于我们不知道您设计的任何其他部分,我们无法回答这样的“应该”问题。如果需要,您应该这样做。

标签: python oop object


【解决方案1】:

不要使用get_* 方法。在 Python 中,更好的方法是使用属性:

class Foo(object):
    @property
    def something1(self):
        # in the actual code it asks a web server but here I replaced that with "foo_something1" instead of the code from a web server
        return "foo_something1"
    @property
    def something2(self):
        # needs the result of get_something1; right now I have it get it by instance variable like so
        return self.something1 + "_something_2"

注意当something1是一个属性时,self.something1(不带括号!)调用对应的函数Foo.something1

一旦你有了工作代码,你就可以看到something2 是如何被使用的。如果你有两个

    @property
    def something2(self):
        return self.something1 + "_something_2"

    @property
    def something3(self):
        return self.otherthing1 + "_something_2"

那么你可能想重构代码来使用

    def something2(self,prefix):
        return prefix+"_something_2"

我们对您的情况了解不多,无法告诉您哪个更好。但是一旦你看到你的工作代码的使用模式,答案可能对你来说很明显。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 2015-10-14
    • 2017-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多