代码之家  ›  专栏  ›  技术社区  ›  thebeancounter

Python-从其中一个方法中替换对象

  •  0
  • thebeancounter  · 技术社区  · 6 年前

    我使用python,有一个对象,这个对象有一个方法。我正在寻找一个简单的方法,从函数中替换整个对象。

    class a():
        def b(self):
            self = other_object
    

    你怎么能那样做?

    谢谢

    0 回复  |  直到 6 年前
        1
  •  1
  •   JL Peyret    6 年前

    self 如果你愿意,那么代理(比Facade更好,但现在不改变我的代码)就是你代码库的其他部分看到的。但是,任何属性/方法访问都被转发到实际对象上,这是可交换的。

    下面的代码应该给你一个大致的概念。请注意,您需要小心周围的递归 __the_instance ,这就是我分配给的原因 __dict__ 直接。有点混乱,因为有段时间我写的代码完全包装了getattr和setattr。

    class Facade:
        def __init__(self, instance):
            self.set_obj(instance)
    
        def set_obj(self, instance):
            self.__dict__["__theinstance"] = instance
    
        def __getattr__(self, attrname):
            if attrname == "__theinstance":
                return self.__dict__["__theinstance"]                
    
            return getattr(self.__dict__["__theinstance"], attrname)
    
        def __setattr__(self, attrname, value):
            if attrname == "__theinstance":
                self.set_obj(value)
    
            return setattr(self.__dict__["__theinstance"], attrname, value)
    
    
    class Test:
        def __init__(self, name, cntr):
            self.name = name 
            self.cntr = cntr
    
        def __repr__(self):
            return "%s[%s]" % (self.__class__.__name__, self.__dict__)
    
    obj1 = Test("first object", 1)
    
    obj2 = Test("second", 2)
    obj2.message = "greetings"
    
    
    def pretend_client_code(facade):
        print(id(facade), facade.name, facade.cntr, getattr(facade, "value", None))
    
    
    facade = Facade(obj1)
    
    pretend_client_code(facade)
    
    facade.set_obj(obj2)
    
    pretend_client_code(facade)
    
    facade.value = 3
    
    pretend_client_code(facade)
    
    facade.set_obj(obj1)
    
    pretend_client_code(facade)
    

    输出:

    4467187104 first object 1 None
    4467187104 second 2 None
    4467187104 second 2 3
    4467187104 first object 1 None
    

    所以基本上,“客户机代码”总是看到同一个facade对象,但是它实际访问的内容取决于你的等价物是什么 def b

    Facade在设计模式术语中有一个特定的含义,它在这里可能并不适用,但已经足够接近了。也许代理会更好。

    请注意,如果要更改 对象,这是另一回事,通过赋值完成 self.__class__ . 例如,假设一个RPG游戏 EnemyClass DeadEnemyClass 一旦被杀: self.__class__ = DeadEnemyClass

        2
  •  0
  •   Bugs Buggy    6 年前

    你不能直接这么做。您可以将其保存为实例变量。

    class A():
        def __init__(self, instance=None):
            self.instance = val or self
    
        # yes, you can make it a property as well.
        def set_val(self, obj):
            self.instance = obj
    
        def get_val(self):
            return self.instance
    

    无论你想做什么,都不能仅仅通过 将func(self)的结果存储到另一个变量中。'“自我”是 有效的局部变量只在 手术。替换self实际上不会替换对的引用 其他对象持有的类的原始实例,也不会 创建对分配给的新实例的持久引用 它。

    原始来源: Is it safe to replace a self object by another object of the same type in a method?