我有一个带有函数的类,它返回该类的另一个实例。因为很多逻辑已经内置到该函数中,所以我想在构造函数中使用它。
以下是我尝试做的一个例子:
class Hello(object):
def __init__(self,name):
self.name = name
if name == "Carol":
# trying to change the object
self = self.append_hello("nice to meet you")
def say_hi(self):
print "Hi, " + self.name
def append_hello(self,string):
# This function returns a "Hello" class instance
return HelloObject(self.name + " " + string)
输出结果如何:
>>> h1 = Hello("Eric")
>>> h1.say_hi()
Hi, Eric
>>> h2 = h1.append_hello("how are you?")
>>> h2.say_hi()
Hi, Eric how are you?
>>> h1.say_hi()
Hi, Eric
但是当我跑步时:
>>> h3 = Hello("Carol")
>>> h3.say_hi()
如果我希望对象与众不同并得到Hi, Carol
,我会得到Hi, Carol nice to meet you
。
有明显的方法来改变这个例子,所以它可以做我想要的。但我希望能够使用像append_hello()
这样的函数来处理更复杂的情况。有什么想法吗?
答案 0 :(得分:1)
您可以通过定义__new__
而不是__init__
来完成此操作。
有关详细信息,请参阅Python's use of __new__ and __init__?
答案 1 :(得分:0)
看起来它可能容易受到无限递归的影响。如果对'" Carol"进行天真的测试删除或更改它可以继续调用和创建新对象。
此外,我相信你打算写self = self.append_hello("nice to meet you")
正如所写,将问候语字段作为班级成员更有意义。然后不需要组合名称和问候语并作为新对象返回。如果您的需求是不可变的对象,请查看写入时复制模式的示例。