【发布时间】:2019-02-12 13:28:50
【问题描述】:
我有一个 python 类,我们称之为MyClass,有几个绑定方法。我需要其中一种方法的行为,称为.dynamic_method(),根据对象创建过程中参数集的值而完全不同。 dynamic_method 的一些变体将在它们之间共享很少的代码,因此将它们定义为单独的函数/方法而不是具有许多选项和条件的单个大型方法是有意义的。我不需要在创建对象后更改此方法的行为,所有内容都可以在__init__() 期间设置。
作为参考,MyClass 管理数据集,.dynamic_method 处理这些数据的一些 IO 方面,这些方面会根据数据集和上下文而变化。
这在技术上并不难实现,但我想出的方法都不是完全正确的:
- 将方法变体单独定义为函数,并在
__init__()期间使用此处描述的方法之一将其中一个作为绑定方法:Adding a Method to an Existing Object Instance。这对我来说似乎是最自然的选择,但该线程中的许多答案强烈反对使用这种模式。 - 将类定义中所有可能的方法定义为
.dynamic_method_a、.dynamic_method_b等,并设置选项/别名以便MyClass.dynamic_method()调用正确的方法。这将导致一个非常长的类定义,并且每个对象都有很多未使用的方法。 - 将方法存储为单独的函数,并让
.dynamic_method()以self作为第一个参数简单地调用正确的函数。这感觉像是对方法概念的故意滥用,并且会破坏 linting。 - 使用工厂模式或对象生成器函数。我宁愿避免这种情况,因为它会给代码库增加迄今为止最大的复杂性。
什么会被认为是实现这种行为的最“Pythonic”的方式?上述方法之一,还是我错过了明显的替代方法?
【问题讨论】:
-
当您说“参数的值”时,您是指作为参数传递的对象的实际值或类型吗?
-
@buran 值。例如
my_object = MyClass(method_variation='b')应该返回一个对象,其中my_class.dynamic_method()指的是方法的变体b(显然所有这些名称都是占位符)。
标签: python python-3.x methods