在一个方法中用同一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文件,对象可能会被完全重新计算(很慢)。