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

Python 实现/调用返回不可变值的类的最佳方法?,python,Python,在Python中,我想这样做: result = SomeClass(some_argument) 不过,这里有个陷阱。我不希望结果是一个实例,而是一个不可变的对象(例如int)。基本上,类的角色是返回根据参数计算的值。我使用的是一个类,而不是一个函数。 因为上面的代码总是返回某个类的实例,所以无法工作,那么最好的选择是什么 我唯一的想法是使用静态方法,但我不喜欢它: result = SomeClass.static_method(some_argument) 您可以覆盖\uuuuuuuu

在Python中,我想这样做:

result = SomeClass(some_argument)
不过,这里有个陷阱。我不希望结果是一个实例,而是一个不可变的对象(例如int)。基本上,类的角色是返回根据参数计算的值。我使用的是一个类,而不是一个函数。 因为上面的代码总是返回某个类的实例,所以无法工作,那么最好的选择是什么

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

result = SomeClass.static_method(some_argument)

您可以覆盖
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
这很少是一个好主意和/或必要的不过

>>> class Foo(object):
...     def __new__(cls):
...         return 1
... 
>>> Foo()
1
>>> type(Foo())
<type 'int'>
>>类Foo(对象):
...     定义新的(cls):
...         返回1
... 
>>>Foo()
1.
>>>类型(Foo())

如果不返回
cls
的实例,将永远不会调用
\uuuu init\uuuu

您可以重写
\uu new\uuuu
这很少是一个好主意和/或必要的不过

>>> class Foo(object):
...     def __new__(cls):
...         return 1
... 
>>> Foo()
1
>>> type(Foo())
<type 'int'>
>>类Foo(对象):
...     定义新的(cls):
...         返回1
... 
>>>Foo()
1.
>>>类型(Foo())

如果不返回
cls
的实例,将永远不会调用
\uuuuu init\uuuu

如果使用工厂方法,基本上类方法是可行的。 关于结果——这实际上取决于您寻求什么样的不变性,但基本上命名为元组在封装方面做得很好,而且也是不可变的(与普通元组类似):

从集合导入namedtuple
类FactoryClass(对象):
_结果类型=namedtuple('ProductClass',['prod','sum'])
@类方法
def生成对象(cls、arg1、arg2):
返回cls.\u结果\u类型(prod=arg1*arg2,sum=arg1+arg2)
>>>FactoryClass.make_对象(2,3)
ProductClass(产品=6,总和=5)
>>>x=_
>>>x.prod=3
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
AttributeError:无法设置属性

如果您有工厂方法,基本上类方法是一种选择。 关于结果——这实际上取决于您寻求什么样的不变性,但基本上命名为元组在封装方面做得很好,而且也是不可变的(与普通元组类似):

从集合导入namedtuple
类FactoryClass(对象):
_结果类型=namedtuple('ProductClass',['prod','sum'])
@类方法
def生成对象(cls、arg1、arg2):
返回cls.\u结果\u类型(prod=arg1*arg2,sum=arg1+arg2)
>>>FactoryClass.make_对象(2,3)
ProductClass(产品=6,总和=5)
>>>x=_
>>>x.prod=3
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
AttributeError:无法设置属性

以什么方式使用类而不是函数可以达到枯燥的目的?
def SomeClass(arg):return arg*42
?我有很多Django函数视图,其中包含一些重复的代码块或代码结构。因此,我创建了一个抽象类来处理锅炉板,并继承了它。使用类而不是函数以何种方式达到了枯燥的目的?
def SomeClass(arg):return arg*42
?我有很多Django函数视图,其中包含一些重复的代码块或代码结构。所以我创建了一个抽象类来处理锅炉板,并继承了它。这就是我想要的:)。为什么这不是一个好主意呢?这只是一种意想不到的行为。我明白了。你是对的。对于类的用户来说,这可能会令人困惑。但是当你有折扣=计算折扣(价格)这样的东西时,它是完美的。用户不应该关心它实际上是一个类。@AlBundy——当然,但是为什么要首先将它设为一个类呢?为什么不使用函数呢?因为我会有很多看起来相同的函数。这不是重复代码块,而是重复代码结构。当这个问题变得严重时,它就是一个问题。这就是我一直在寻找的:)。为什么这不是一个好主意呢?这只是一种意想不到的行为。我明白了。你是对的。对于类的用户来说,这可能会令人困惑。但是当你有折扣=计算折扣(价格)这样的东西时,它是完美的。用户不应该关心它实际上是一个类。@AlBundy——当然,但是为什么要首先将它设为一个类呢?为什么不使用函数呢?因为我会有很多看起来相同的函数。这不是重复代码块,而是重复代码结构。当这个问题变得严重时,它就是一个问题。