在方法中用同一类型的另一个对象替换自身对象是否安全?

ami*_*che 36 python

我想用这样的方法中的另一个实例替换对象实例:

class A:
    def method1(self):
        self = func(self)
Run Code Online (Sandbox Code Playgroud)

从数据库中检索对象.

Amb*_*ber 59

替换'self'变量不太可能完成你想要做的任何事情,这不仅可以通过将func(self)的结果存储在不同的变量中来实现.'self'实际上是一个局部变量,仅在方法调用的持续时间内定义,用于传入正在操作的类的实例.替换self实际上不会替换对其他对象持有的类的原始实例的引用,也不会创建对分配给它的新实例的持久引用.

  • 不,我不。更新 __dict__ 的内容并不是用另一个对象替换一个对象。(例如,如果对象实际上已被替换,它会导致“is”检查的行为不符合您的预期,如果对象是一个差异类,它将不会更改,等等)@Nithin 的答案既危险又不正确。 (3认同)
  • 您的答案如何与比您小 7 岁的人表达一致(/sf/answers/2636107141/)?你的仍然“正确”吗?即使我几乎不明白这如何被认为是一个好的做法,看起来“绿色勾号”应该从你的移到@Nithin 的,你不这么认为吗? (2认同)
  • @keepAlive 从表面上看,问题是试图用一个对象实例替换另一个对象实例。@Nithin 的答案用另一个对象的属性破坏了一个对象属性的_子集_。我同意@Amber:这与所要求的行为根本不同,很hacky,甚至可能不会导致两个具有相同属性的对象。“self”中不在“newObj”中的属性保持不变。依赖于对象引用的操作不会按预期运行,这_可能_是一个关键方面...我现在正在查看的代码恰好就是这种情况,导致我提出这个问题。 (2认同)

Nit*_*hin 22

据我所知,如果您尝试用成员函数替换当前对象与相同类型的另一个对象(假设func不会更改对象类型).我认为这将实现这一目标

class A:
    def method1(self):
        newObj = func(self)
        self.__dict__.update(newObj.__dict__)
Run Code Online (Sandbox Code Playgroud)


8da*_*day 11

这不是问题的直接答案,但在下面的帖子中,有一个解决方案,即amirouche试图做的事情:

这是工作代码示例(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
Run Code Online (Sandbox Code Playgroud)

请注意self.__class__而不是self.__class__.__name__.即这种技术不仅取代了类名,而且实际上转换了一个类的实例(至少它们都有相同的id()).另外,1)我不知道在[对象拥有]方法中用另一个相同类型的对象替换自身对象是否安全"; 2)它适用于不同类型的对象,不仅适用于相同类型的对象; 3)它的工作原理并不完全像amirouche想:你不能初始化类一样Class(args),只是Class()(我不亲,不能回答为什么是这样的).


Bli*_*ixt 6

是的,所有会发生的事情是你将无法引用你的类的当前实例A(除非你self在更改之前设置另一个变量.)我不推荐它,但它会使代码不太可读.

请注意,您只需更改变量,就像其他变量一样.做self = 123就像做一样abc = 123.self只是对方法中当前实例的引用.您无法通过设置更改实例self.

我们func(self)应该做的是更改实例的变量:

def func(obj):
    obj.var_a = 123
    obj.var_b = 'abc'
Run Code Online (Sandbox Code Playgroud)

然后这样做:

class A:
    def method1(self):
        func(self) # No need to assign self here
Run Code Online (Sandbox Code Playgroud)