【发布时间】:2019-08-09 02:01:09
【问题描述】:
我读到在类命名空间中创建变量然后在类构造函数中更改其值被认为是不好的做法。
(我的一个消息来源:SoftwareEngineering SE: Is it a good practice to declare instance variables as None in a class in Python。)
考虑以下代码:
# lib.py
class mixin:
def __init_subclass__(cls, **kwargs):
cls.check_mixin_subclass_validity(cls)
super().__init_subclass__(**kwargs)
def check_mixin_subclass_validity(subclass):
assert hasattr(subclass, 'necessary_var'), \
'Missing necessary_var'
def method_used_by_subclass(self):
return self.necessary_var * 3.14
# app.py
class my_subclass(mixin):
necessary_var = None
def __init__(self, some_value):
self.necessary_var = some_value
def run(self):
# DO SOME STUFF
self.necessary_var = self.method_used_by_subclass()
# DO OTHER STUFF
为了强制其子类声明变量necessary_var,类mixin 使用元类subclass_validator。
我知道让它在 app.py 方面工作的唯一方法是将 necessary_var 初始化为类变量。
我遗漏了什么,或者这是唯一的方法吗?
【问题讨论】:
-
当你尝试访问不存在的
self.necessary_var时,为什么不让错误发生? -
assert提高AssertionError将也是生产中的副作用。 -
但是,如果有人不打算设置
necessary_var,那么是什么阻止他们不从mixin继承呢?绕过检查就像绕过你要检查的东西一样容易。 -
请注意,您并没有更改 class 变量
necessary_var的值,在my_subclass.__init__中,您是 shadowing它带有一个名为necessary_var的 instance 变量。 -
@N0ne 在这种情况下,唯一明智的方法是正确记录您的 api 并允许正常引发异常。作为开发人员,他们应该想要准确的行为,以便他们可以有效地调试他们的编码错误。如果他们仍然抱怨,请礼貌地让他们参考您的文档。
标签: python mixins metaclass class-variables