【问题标题】:python3 default class attribute to method in same classpython3默认类属性到同一类中的方法
【发布时间】:2019-05-27 15:32:15
【问题描述】:
class Test:
    func = self.func2 # default: func is func2 by default
    # tried Test.func2 as well and Pycharm shows error

    def __init__(self, func=None):
        if func is not None:
            self.func = func

    def func1(self):
        pass

    def func2(self):
        pass

谁能建议如何实现上述目标?

我也尝试在构造函数中将 func 参数设置为默认为 func2 但这也会出错。

所以稍后,在 Test 类的某个地方,我可以只调用 self.func 而不是重复运行条件来找出应该使用 func1 还是 func2

self.func()

**** 解决方案(我做了什么)****

在main.py中:

t = Test(func=Test.func1)
t.func(t, **kwargs)

这应该通过调用高阶方法 t.func 成功调用 t.func1(或 t.func2,如果指定)并访问 t instance_attributes

【问题讨论】:

  • 你想解决什么问题?
  • 将属性默认为同一方法的许多替代实现之一,以便在类中重用
  • 查看编辑可能有帮助吗?
  • 传递给__init__func应该是func1还是func2
  • @TianboJi 是的 func 只能是多个选项中的任何一个

标签: python-3.x class oop default-value


【解决方案1】:

您可以根据func 参数的值在__init__ 方法中设置默认值:

可能是这样的:

class Test:

    def __init__(self, func=None):
        if func is None:
            self.func = self.func2
        else:
            self.func = func

    def func1():
        print('func1')

    def func2(self):
        print('func2')

Test().func()
Test(Test.func1).func()

输出:

func2
func1

【讨论】:

  • 问题,我如何在构造时将Test.func2作为func参数传递而不是在构造后重新分配?
  • 你可以做t = Test(func=Test.func2)
  • 它说明了缺少 1 个位置参数。我猜这是因为实例方法缺少“self”第一个参数?
  • 通过将目标对象实例作为第一个参数传递给目标中定义的高阶方法(例如测试实例)来解决它。因此目标对象(测试实例)解析“自我”
  • 实际上,缺少 self 作为 func2 的参数,抱歉。
【解决方案2】:

如果您不使用self(未定义)并且将其移至类定义的末尾,那么您在类范围内执行分配的代码将起作用,这样func2 将存在于运行时的命名空间。

class Test:
    def __init__(self, func=None):
        if func is not None:
            self.func = func

    def func1():
        pass

    def func2():
        pass

    func = func2 # this will work down here

我会注意到,当您将函数分配给类变量时,它将被视为方法,因此您可能需要更改 func2 以期望 self 作为其第一个参数。对于分配为实例变量的方法,绑定行为不会发生,就像传递给 __init__ 方法的任何 func 一样。如果您想为这些绑定行为,您需要自己实现它(可能使用functools.partial)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    • 2012-08-15
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    • 2012-01-05
    • 1970-01-01
    相关资源
    最近更新 更多