用大量导入的函数创建类

2024-10-03 23:24:24 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我在alotoffunc.py中有很多函数被一种以上的对象使用。在

假设ObjectI和{}和{}都使用了alotoffunc.py中的一些函数。每个对象都使用不同的函数集,但所有对象都有变量object.table。在

alotoffunc.py

def abc(obj, x):
  return obj.table(x) * 2

def efg(obj, x):
  return obj.table(x) * obj.table(x)

def hij(obj, x, y):
  return obj.table(x) * obj.table(y)

def klm(obj, x, y):
  return obj.table(x) *2 - obj.table(y)

然后导入函数并重载它们:

^{pr2}$

现在看起来一团糟,我应该如何构建我的对象类并安排我的alotoffunc.py?在


Tags: 对象函数pyobjreturnobjectdeftable
3条回答

如果我想避免mixin,也许是为了最小化代码的不透明度,我会这样做:

class ObjectI:
    from alotoffunc import abc, efg

class ObjectII:
    from alotoffunc import efg, klm

class ObjectXI:
    from alotoffunc import abc, klm

无论何时创建类的实例,导入的方法都会自动绑定。换句话说,它们在默认情况下是实例方法。在

如果希望它们是静态方法,请按如下方式使用^{}

^{pr2}$

另外,我也不会太担心这些多个import语句的性能问题,因为Python非常聪明,只运行一次导入的模块,然后将它保存在内存中,以备以后需要。在

如果您想要导入的函数有某种逻辑分组,那么您肯定应该使用mixin,或者将函数组织成单独的“mixin modules”,这样您甚至可以from mixinmodule import *。对于mixin类方法,我认为常规import语句比from import更好,除非您的函数名很长并且只想输入一次!在

(1)可以有一个实现所有方法的基类,然后重写不必要的方法来在子类中引发NotImplementedError。在

(2)您可以使用mixin来减少重复:

import alotoffunc

class MixinAbc:
    def abc(self, x):
        return alotoffunc.abc(self, x)

class MixinEfg:
    def efg(self, x):
        return alotoffunc.efg(self, x)

class MixinKlm:
    def klm(self, x, y):
        return alotoffunc.klm(self, x, y)

class ObjectI(MixinAbc, MixinEfg):
    pass

class ObjectII(MixinEfg, MixinKlm):
    pass    

class ObjectXI(MixinAbc, MixinKlm):
    pass

您也可以将此方法与@cpburnz的方法相结合。在

最简单的方法是将所需函数作为实例方法直接绑定到其定义中的类。请注意,每个函数将接收self作为第一个参数。在

import alotoffunc

class ObjectI:
  abc = alotoffunc.abc
  efg = alotoffunc.efg

class ObjectII:
  efg = alotoffunc.efg
  klm = alotoffunc.klm

class ObjectXI:
  abc = alotoffunc.abc
  klm = alotoffunc.klm

如果各种函数没有清晰、逻辑的分组,那么在类中定义mix可能是一种更简单的方法。分组确实取决于您的用例,因此mix-in方法可以更好地取决于具体情况。在

相关问题 更多 >