【问题标题】:How to initialize new instance *as* existing instance?如何将新实例初始化为*现有实例?
【发布时间】:2020-11-08 21:38:57
【问题描述】:

有时在__init__ 中我已经拥有 self 应该成为的实例,我只是想将其设置为该实例。
最简单的情况是使用的参数初始化 Foo 本身就是 Foo
Foo(Foo(x)) == Foo(x) 就像 set({1, 2}) == {1, 2}。)
在示例中,这是case_trivial。但也有case_variadic

目前我必须自己设置每个属性。有没有办法在一行中做到这一点?

from variadic_foo_operations import foo_addition, foo_multiplication


class Foo(object):

    def __init__(self, arg=None, addends=None, factors=None):

        case_arg = arg is not None
        case_normal = case_arg and type(arg) == int
        case_trivial = case_arg and type(arg) == Foo

        case_add = addends is not None
        case_multiply = factors is not None
        case_variadic = case_add or case_multiply

        if case_normal:
            self.bar = arg
            self.double_bar = 2 * arg
        elif case_trivial:
            the_foo_i_want = arg
        elif case_variadic:
            operation = foo_addition if case_add else foo_multiplication
            operands = addends if case_add else factors
            current_foo = Foo(0) if case_add else Foo(1)  # neutral element
            for operand_foo in operands:
                current_foo = operation(current_foo, operand_foo)
            the_foo_i_want = current_foo

        if case_trivial or case_variadic:
            # What I would like:
            self = the_foo_i_want
            # What I have to do instead:
            self.bar = the_foo_i_want.bar
            self.double_bar = the_foo_i_want.double_bar

【问题讨论】:

  • 不,当 __init__ 被调用时,Python 已经创建了新实例 - self 在那时只是一个方法参数,分配给它不会在方法之外产生任何影响.也许您想改写__new__
  • 听起来你想要一个复制构造函数,但是 Python 没有提供任何类似的开箱即用的东西。作为说明,我认为这种方法做了太多不同的工作。我建议在您的__init__ 中保留初始化并引入实现计算的辅助函数。所以你会有类似def new_foo_add(addends): ...; return Foo(bar=..., ...) 的东西。此外,如果您从 Foo 继承,type(arg) == Foo 将会中断。
  • @Norrius 如果addends 是初始化Foo 的方法之一,那么__init__ 就是我拥有它的地方。您如何获得它的辅助功能?

标签: python python-class


【解决方案1】:

在这里找到答案:How to copy all properties of an object to another object

self.__dict__ = the_foo_i_want.__dict__.copy()

【讨论】:

    猜你喜欢
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    • 2021-05-11
    • 1970-01-01
    • 2013-10-18
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多