实现/调用返回不可变值的类的最佳方法是什么?

时间:2013-05-19 20:23:21

标签: python

我在Python中会这样:

result = SomeClass(some_argument)

虽然这是一个问题。我不希望结果是一个实例,而是一个不可变对象(例如int)。基本上,类的孔角色返回从参数计算的值。我正在使用一个类而不是用于DRY目的的函数。 由于上面的代码不起作用,因为它总会返回SomeClass的一个实例,最好的选择是什么呢?

我唯一的想法是使用静态方法,但我不喜欢它:

result = SomeClass.static_method(some_argument)

2 个答案:

答案 0 :(得分:3)

您可以覆盖__new__这很少是一个好主意和/或必要的虽然...

>>> class Foo(object):
...     def __new__(cls):
...         return 1
... 
>>> Foo()
1
>>> type(Foo())
<type 'int'>

如果您不返回cls的实例,则永远不会调用__init__

答案 1 :(得分:0)

如果你有一个工厂方法,基本上是类方法。 关于结果 - 它实际上取决于你寻求什么样的不变性,但基本上namedtuple在封装事物方面做得很好,也是不可变的(就像普通元组一样):

from collections import namedtuple
class FactoryClass(object):
     _result_type = namedtuple('ProductClass', ['prod', 'sum'])
     @classmethod
     def make_object(cls, arg1, arg2):
         return cls._result_type(prod=arg1 * arg2, sum=arg1 + arg2)

>>> FactoryClass.make_object(2,3)
ProductClass(prod=6, sum=5)
>>> x = _
>>> x.prod = 3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: can't set attribute