我在Python中会这样:
result = SomeClass(some_argument)
虽然这是一个问题。我不希望结果是一个实例,而是一个不可变对象(例如int)。基本上,类的孔角色返回从参数计算的值。我正在使用一个类而不是用于DRY目的的函数。 由于上面的代码不起作用,因为它总会返回SomeClass的一个实例,最好的选择是什么呢?
我唯一的想法是使用静态方法,但我不喜欢它:
result = SomeClass.static_method(some_argument)
答案 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