【问题标题】:which to use: class variables versus classmethod?使用哪个:类变量与类方法?
【发布时间】:2014-06-09 20:01:19
【问题描述】:

作为下面的玩具示例,它们都创建了相同的类(尽管一个使用Foo.spam() 而另一个使用Foo.spam 来获取值)。我的问题是,选择一个而不是另一个的标准是什么?如果spam需要频繁访问,由于函数开销,最好使用第二类实现?还要别的吗?

class Foo(object):
    def __init__(self, a):
        self.a = "init"
    @classmethod
    def spam(cls, value=2):
        return value + 1
Foo.spam() # -> 3
Foo.spam(3) #-> 4

class Foo(object):
    spam = 3
    def __init__(self, a):
        self.a = "init"
Foo.spam  #-> 3
Foo.spam = 4
Foo.spam  #-> 4

【问题讨论】:

  • 你能提供一个更清晰的用例吗?这两个示例都没有足够清楚地说明您想要实现的目标,特别是,在您传入 3 后,这些示例在未来访问方面的行为非常不同。

标签: python


【解决方案1】:

我认为这两种方法都不是正确的(为类属性分配默认值)。你为什么不干脆这样做?

class Foo(object):
    def __init__(self, a = 'init'):
        self.a = a
        self.spam = 2

然后:

>>> a_foo = Foo()
>>> a_foo.spam
2
>>> a_foo.spam = 3
>>> a_foo.spam
3

如果您通过静态类属性(您的第二个示例)执行此操作,则根据您分配/访问它的方式,您可以获得非常不同的行为:

class Foo(object):
    spam = 2
    def __init__(self, a = 'init'):
        self.a = a

然后:

>>> a_foo1 = Foo()
>>> a_foo2 = Foo()
>>> a_foo1.spam
2
>>> a_foo2.spam
2
>>> Foo.spam = 3
>>> a_foo1.spam
3
>>> a_foo2.spam
3

# But now they'll diverge
>>> a_foo1.spam = 5
>>> a_foo1.spam
5
>>> a_foo2.spam
3
>>> Foo.spam = 2
>>> a_foo1.spam
5
>>> a_foo2.spam
2

如果您尝试修改spam 的任何instance 的 副本来修改spam所有 instance 的 副本,您将使用与静态属性结合的属性

class Foo(object):
    _spam = 2
    def __init__(self, a = 'init'):
        self.a = a

    @property
    def spam(self):
        return Foo._spam

    @spam.setter
    def spam(self, value)
        Foo._spam = value

>>> a_foo1 = Foo()
>>> a_foo2 = Foo()
>>> a_foo1.spam
2
>>> a_foo2.spam
2
>>> a_foo1.spam = 3
>>> a_foo2.spam
3

虽然这种单例属性行为有些危险并且可能被某些人认为是反模式,因为类的大多数用户不期望修改一个实例的属性来修改所有实例的属性。这样做肯定需要有充分的理由。

【讨论】:

    【解决方案2】:

    如果该方法什么都不做,只是返回一个属性值,则使用该属性。

    但是,您的示例很奇怪,因为您传入了您想要返回的值。如果只想要数字3,则不需要使用Foo.spam(3) Foo.spam = 3;只需使用数字 3。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-12
      • 1970-01-01
      • 1970-01-01
      • 2015-05-26
      • 2019-06-08
      • 1970-01-01
      相关资源
      最近更新 更多