python - 定义类的部分特化
问题描述
我有一堆类,它们都只因字符串和函数而异,如下所示:
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 需要是正确的类定义。
解决方案
_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)
推荐阅读
- javascript - 如何在节点 js 中使用用户身份验证访问 UNC 文件路径
- javascript - 尝试在 js 中拆分 url 时出现问题
- ios - 将数据从 tableview 传递到另一个 tableview
- python - 正在添加的空白帖子,以及用户创建的帖子 (Django)
- python - message.content.startswith Discord.Py
- javascript - 使用 jquery 每个读取 html 表行中的值
- java - 设置工作目录 Spring Boot 可执行 jar
- python - 使用 CTRL_C_EVENT 关闭 QProcess 后忽略 KeyboardInterrupt
- javascript - 如何在highcharts中添加动态系列
- java - 如何在Java中添加两个列表