首页 > 解决方案 > 定义类的部分特化

问题描述

我有一堆类,它们都只因字符串和函数而异,如下所示:

class ClassOne:
    __init__(self, x):
        self._x = x
        self._my_str = 'hello'

    def greet():
       fun1(self._x)
       return self._my_str

class ClassTwo:
     __init__(self, x):
        self._x = x
        self._my_str = 'howdy'

     def greet():
         fun2(self._x)
         return self._my_str

我希望能够定义

ClassOne = ClassTemplate('hello', fun1)
ClassTwo = ClassTemplate('howdy', fun2)

这样ClassOne 和ClassTwo 仍然充当普通类,即可以导入其他模块等。我意识到这可能是一种标准技术,但不知道它的名称我无法通过谷歌搜索它(这也解释了我无法正确命名问题)

我意识到我可以将它们作为初始化的一部分,但是函数和字符串的选择对于用户来说根本不明显,所以我更愿意命名它们。

编辑:似乎人们误解了我的追求。继续我想要做的例子

first_instance = ClassOne(3.14)
second_instance = ClassTwo(2.71)
first_instance.greet()

即 ClassOne 和 ClassTwo 需要是正确的类定义。

标签: pythonpython-3.x

解决方案


_my_str可以是属性,您可以使用 __init_subclass__适当的基类提供的设置。我们将创建fun一个静态方法,以便用户不必fun专门定义。

class BaseClass:
    def __init_subclass__(cls, my_str=None, fun=None):
        cls._my_str = my_str
        cls._fun = staticmethod(fun)

    def __init__(self, x):
        self._x = x

    def greet(self):
        self._fun(self._x)
        return self._my_str


class ClassOne(BaseClass, my_str='hello', fun=fun1):
    pass

class ClassTwo(BaseClass, my_str='howdy', fun=fun2):
    pass

(如果您只是使用cls._fun = fun, thenself._fun(self._x)将等同于type(self)._fun(self, self._x),而不是预期的type(self)._fun(self._x)。)

或者,您可以简单地显式声明类属性,尽管现在调用者负责正确定义fun为静态方法。

class BaseClass:    
    def __init__(self, x):
        self._x = x

    def greet(self):
        self._fun(self._x)
        return self._my_str


class ClassOne(BaseClass):
    _my_str = 'hello'
    fun = staticmethod(fun1)


class ClassTwo(BaseClass):
    my_str = 'howdy'
    fun = staticmethod(fun2)

无论哪种情况,您都可以推迟设置类属性:

class ClassThree(BaseClass):
    pass

# time passes

ClassThree._my_str = "g'day"
ClassThree.fun = staticmethod(fun3)

推荐阅读