在一个方法中用同一types的另一个对象replace一个自己的对象是否安全?

我想用另一个实例在一个像这样的方法中replace一个对象实例:

class A: def method1(self): self = func(self) 

该对象从数据库中检索。

replace“self”variables不太可能完成你所要做的任何事情,这不可能通过将func(self)的结果存储在一个不同的variables中来实现。 'self'实际上是一个只在方法调用期间定义的局部variables,用于传递正在被操作的类的实例。 replace自己实际上不会取代对其他对象所持有类的原始实例的引用,也不会为分配给它的新实例创build持久引用。

是的,发生的一切就是你将无法引用你的类A的当前实例(除非你在改变它之前将另一个variables设置为self )。但是我不会推荐它,码。

请注意,您只是像更换其他variables一样更改variables。 做self = 123和做abc = 123是一样的。 self只是对方法内的当前实例的引用。 你不能通过设置self来改变你的实例。

什么func(self)应该做的是改变你的实例的variables:

 def func(obj): obj.var_a = 123 obj.var_b = 'abc' 

然后这样做:

 class A: def method1(self): func(self) # No need to assign self here 

这不是直接回答这个问题,但是在下面的post中,有一个解决scheme是什么amirouche试图做的:

  • Python对象转换
  • 我能dynamic地将一个类的实例转换为另一个类的实例吗?

这里是工作代码示例(Python 3.2.5)。

 class Men: def __init__(self, name): self.name = name def who_are_you(self): print("I'm a men! My name is " + self.name) def cast_to(self, sex, name): self.__class__ = sex self.name = name def method_unique_to_men(self): print('I made The Matrix') class Women: def __init__(self, name): self.name = name def who_are_you(self): print("I'm a women! My name is " + self.name) def method_unique_to_women(self): print('I made Cloud Atlas') men = Men('Larry') men.who_are_you() #>>> I'm a men! My name is Larry men.method_unique_to_men() #>>> I made The Matrix men.cast_to(Women, 'Lana') men.who_are_you() #>>> I'm a women! My name is Lana men.method_unique_to_women() #>>> I made Cloud Atlas 

请注意self.__class__而不是self.__class__.__name__ 。 即这种技术不仅取代了类名,而且实际上转换了一个类的实例(至less它们都具有相同的id() )。 此外,1)我不知道是否是“安全的replace自己的对象由同一types的另一个对象在[对象自己]方法”; 2)它适用于不同types的对象,不仅适用于相同types的对象; 3)它不像amirouche想要的那样工作:你不能像Class(args)那样初始化类,只有Class() (我不是专业人士,不能回答为什么它是这样的)。

据我了解,如果您试图用成员函数replace当前对象与另一个相同types的对象(假设func不会更改对象types)。 我认为这将实现这一点

 class A: def method1(self): newObj = func(self) self.__dict__.update(newObj.__dict__) 

可以在方法中使用自赋值,将实例的类更改为派生类。

当然可以把它分配给一个新的对象,但是这个新对象的使用会在方法中的其余代码中涟漪。 将其重新分配给自己,保持方法的其余部分不变。

 class aclass: def methodA(self): ... if condition: self = replace_by_derived(self) # self is now referencing to an instance of a derived class # with probably the same values for its data attributes # all code here remains untouched ... self.methodB() # calls the methodB of derivedclass is condition is True ... def methodB(self): # methodB of class aclass ... class derivedclass(aclass): def methodB(self): #methodB of class derivedclass ... 

但除了这样一个特殊用例之外,我看不出有什么好处来取代自己。

我在init方法中分配了self。 我的理由是可以通过阅读一个pickle文件(快速)来创build对象,但是如果缺lesspickle文件,对象可能会被完全重新计算(很慢)。